拆分 CSV 后应用 nltk.FreqDist

Applying nltk.FreqDist after splitting a CSV

我一直在尝试使用以 | 作为分隔符并以 \n 作为换行符的数据集。
a | b | c c | e | f

我一直在尝试用 rec[0].split('|') 拆分集合并应用 nltk.FreqDist(rec)

这是我的源代码

import nltk
import csv
from nltk.util import ngrams

with open('CG_Attribute.csv', 'r') as f:
    for row in f:
        splitSet = row.split('|')
        for rec in splitSet:
            # token = nltk.word_tokenize(rec)
            result = nltk.FreqDist(rec)
            print(result)

我得到的输出如下

<FreqDist with 14 samples and 22 outcomes>
<FreqDist with 8 samples and 9 outcomes>
<FreqDist with 1 samples and 1 outcomes>
<FreqDist with 26 samples and 44 outcomes>
<FreqDist with 6 samples and 8 outcomes>

我期待的是

[('a',1),('b',1),('c',2),('e',1),('f',1)]

谁能指出我哪里搞砸了?任何建议都会有所帮助:)

PS - 我什至用过 csv,但运气不好

先生,您似乎错过了几个步骤。

当您遍历文件中的行并用“|”分隔它们时,您的结果实际上是一系列列表:

row1: ["a ", " b ", " c "]
row2: ["c ", " e ", " f "]

我想你想要的(如果我错了请纠正我)是将这些列表拼接成一个大列表,这样你就可以计算整个文件中项目的频率。您可以通过以下方式执行此操作:

with open('CG_Attribute.csv') as f:
    tokens = [token for row in f for token in row.split("|")]

现在您已将所有单词都放在一个列表中,您可以计算它们的出现频率了。根据您描述的输出数据,我实际上认为 nltk.FreqDist 对此有点矫枉过正,您应该可以使用 collections.Counter

from collections import Counter
token_counts = Counter(tokens)
# if using python 2
token_count_tuples = token_counts.items()

请注意,由于 FreqDist 继承自 Counter,您可以轻松地在上面的代码片段中替换它,以防您仍然真的想使用它。

如果你正在使用 Python 3,Counter.items() returns 一个迭代器,而不是一个列表,所以你必须明确地转换它:

token_count_tuples = list(token_counts.items())

Et viola,你已经将你的代币与它们各自的计数配对了!

最后一点:您可能需要对您的令牌调用 str.strip(),因为我不认为按“|”拆分将删除单词和分隔符之间的空格。但这取决于您的真实数据是什么样子以及您是否要考虑空格。