首页 > 解决方案 > 基于 n-gram 过滤数据框中的行

问题描述

我需要根据最常见的 n-gram 过滤行,即 n-gram 列表中包含的术语。为了计算 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 ...

... 2020 年 5 月 1 日 各国正在寻找疫苗... 美国正在研制疫苗...

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

Trump won election 46
US working vaccine  45

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

标签: pythonpandasscikit-learn

解决方案


您可以使用该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]

推荐阅读