基于 n 元语法筛选数据帧内的行



我需要根据最常见的 n-gram 过滤行,即包含在 n 元语法列表中的术语。 为了计算n-gram,我使用了以下内容:

bigrams = [x for l in x_train['texts'] for x in zip(l.split(" ")[:-1], l.split(" ")[1:])]

从上面的代码行中获得的输出示例:

[('Donald', 'Trump,'), ('president,', 'Trump'), ('US', 'election'), ...]

然后我用sklearn找到n-gram的频率:

from sklearn.feature_extraction.text import CountVectorizer
word_vectorizer = CountVectorizer(ngram_range=(3,3), analyzer='word')
sparse_matrix = word_vectorizer.fit_transform(x_train['texts'])
freq = sum(sparse_matrix).toarray()[0]
df=pd.DataFrame(freq, index=word_vectorizer.get_feature_names(), columns=['Frequency'])
df.sort_values(by='Frequency', ascending=False)

输出的一个示例是:

Frequency
Trump won election 46
US working vaccine  45
seqirus coronavirus vitamine    45
... ...
Apple closed shops  1
still water helps   1

我的原始数据集 (old_df( 包含以下列:

Date               Texts                                     Messages                    Other columns 
05/24/2020     The US president Donald Trump said...     Donald Trump won election ...

。 05/01/2020 各国正在寻找疫苗... 美国正在研究疫苗...

我想根据上面最常见的 n-gram 的结果过滤文本和消息。 因此,例如,由于最常见的 ngram 是

Trump won election 46
US working vaccine  45

我想过滤我的数据集,专注于文本和消息,如果文本或消息列包含 n 元语法中的确切单词/句子。 你知道这是否可能,我该怎么做吗?

您可以使用pandas.Series.str.contains函数。

它将如何在Texts列上工作的示例:

nth_most_frequent = 20
old_df['Text_contains_ngrams'] = 0
Texts_str = old_df['Texts'].str
for phrase in df.index[:nth_most_frequent]:
old_df['Text_contains_ngrams'] |= Texts_str.contains(phrase)

然后你可以使用掩码来过滤你的df

old_df[old_df.Text_contains_ngrams]

最新更新