【问题标题】:How to find ngram frequency of a column in a pandas dataframe?如何在熊猫数据框中查找列的 ngram 频率?
【发布时间】:2016-08-03 00:05:35
【问题描述】:

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

我想找出一元和二元的频率。下面是我所期待的示例

如何使用 nltk 或 scikit learn 做到这一点?

我编写了下面的代码,它接受一个字符串作为输入。如何将其扩展到系列/数据框?

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()

【问题讨论】:

    标签: pandas nlp scikit-learn nltk text-mining


    【解决方案1】:

    如果你的数据是这样的

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

    你可以使用包sklearnCountVectorizer

    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 只会“训练”你的矢量化器:它会分割你的语料库中的单词并用它创建一个词汇表。然后transform 可以获取一个新文档并根据向量化器词汇创建频率向量。

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

    编辑 2

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

    frequencies = sum(sparse_matrix).data
    

    【讨论】:

    • +1 你能解释一下 fit_transform() / fit() / transform() 之间的区别吗?你是怎么知道 sum(sparse_matrix).toarray()[0] 给出频率的?我在 scikit learn 文档中没有找到太多关于重新分级的信息。
    • @ML_Pro 我在答案中添加了解释。
    • 标记为答案。很有帮助的解释。
    • 非常优雅的方式,但 'sum(sparse_matrix).toarray()[0]' 命令需要很长时间才能处理大数据集。
    • @Till - sum(sparse_matrix).data 给了我错误的频率。
    猜你喜欢
    • 2022-08-15
    • 2020-12-08
    • 1970-01-01
    • 2020-07-26
    • 2020-07-03
    • 2015-06-06
    • 1970-01-01
    • 2018-03-28
    • 1970-01-01
    相关资源
    最近更新 更多