python - 基于 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 中的确切单词/句子,我想过滤我的数据集,重点关注文本和消息。你知道这是否可能,我该怎么做?
解决方案
您可以使用该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]
推荐阅读
- javascript - 尝试使用 Discord 的 oauth2 时出现“invalid_grant”错误
- c++ - 任何类型数组的模板规范
- wordpress - 父母的Wordpress wp_get_post_terms订单未正确订购子孙
- c# - Blazor 应用程序生成错误的 MvcApplicationPartsAssemblyInfo.cs
- r - 如何删除 R 中的节点子节点
- linux - libbpf:找不到外部“不太可能”的 BTF:-2
- ios - SwiftUI 中的旋转效果
- python - Pytorch 数据集。一旦捕获异常,项目似乎没有添加到列表中
- sql - 如何使数据库能够相互连接?
- javascript - 在不记录用户的情况下修改数据库的方法?