如何在 pandas 数据框中查找列的 ngram 频率?

How to find ngram frequency of a column in a pandas dataframe?

下面是我的输入 pandas 数据框。

我想找出一元组和二元组的出现频率。下面显示了我所期望的示例

如何使用 nltk 或 scikit 学习来做到这一点?

我写了下面的代码,它接受一个字符串作为输入。如何扩展到 series/dataframe?

from nltk.collocations import *
desc='john is a guy person you him guy person you him'
tokens = nltk.word_tokenize(desc)
bigram_measures = nltk.collocations.BigramAssocMeasures()
finder = BigramCollocationFinder.from_words(tokens)
finder.ngram_fd.viewitems()

如果你的数据像

import pandas as pd
df = pd.DataFrame([
    'must watch. Good acting',
    'average movie. Bad acting',
    'good movie. Good acting',
    'pathetic. Avoid',
    'avoid'], columns=['description'])

您可以使用包 sklearn:

CountVectorizer
from sklearn.feature_extraction.text import CountVectorizer
word_vectorizer = CountVectorizer(ngram_range=(1,2), analyzer='word')
sparse_matrix = word_vectorizer.fit_transform(df['description'])
frequencies = sum(sparse_matrix).toarray()[0]
pd.DataFrame(frequencies, index=word_vectorizer.get_feature_names(), columns=['frequency'])

这给了你:

                frequency
good            3
pathetic        1
average movie   1
movie bad       2
watch           1
good movie      1
watch good      3
good acting     2
must            1
movie good      2
pathetic avoid  1
bad acting      1
average         1
must watch      1
acting          1
bad             1
movie           1
avoid           1

编辑

fit 只会 "train" 你的向量化器:它会拆分你的语料库中的单词并用它创建一个词汇表。然后transform可以获取一个新文档并根据向量化器词汇表创建频率向量。

这里你的训练集就是你的输出集,所以你可以同时做这两件事(fit_transform)。因为你有 5 个文件,它会创建 5 个向量作为矩阵。你想要一个全局向量,所以你必须做一个 sum.

编辑 2

对于大数据帧,您可以使用以下方法加快频率计算:

frequencies = sum(sparse_matrix).data