计算文档中的 ngram 频率

Count ngram frequency in documents

我想计算语料库中每个文档中的 ngram 数量,以便删除所有文档中出现频率最高的那些(例如,出现在 10 多个不同文档中的那些)。

import pandas as pd
import numpy as np

data = {'docid': [1, 2, 3], 'bigrams': [['i_am', 'am_not', 'not_very', 'very_smart'], ['i_am', 'am_learning', 'learning_python'], ['i_have', 'have_blue', 'blue_eyes']]}
dataset = pd.DataFrame(data, columns = ['docid', 'bigrams'])


bigrams_list = []
for bigrams in dataset['bigrams']:
    for bigram in bigrams:
        if bigram not in bigrams_list:
            bigrams_list.append(bigram)

在这里,我想我会遍历数据帧行,如果文档(行)中存在二元组,则为每个 bigrams_list 生成一个布尔值。但这似乎不是很有效,因为我的语料库有超过 5'000 个文档和 400'000 个不同的二元语法。

有谁知道什么最适合这种情况?

您可能可以看看 scikit-learn 的 CountVectorizer,它主要用于 NLP 中的特征预处理,但我很确定您可以使用它来高效地完成您需要做的事情(设置 ngram_range到所需的值,拟合矢量化器,然后将 .get_feature_names() 的结果与生成的矩阵结合起来,将每个 n-gram 与其在整个语料库中的计数相关联:https://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.CountVectorizer.html