我需要根据最常见的 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]