分割CSV后应用nltk.FreqDist

时间:2016-05-11 09:04:40

标签: python csv nltk frequency-distribution

我一直在尝试使用数据集,其中|作为分隔符,\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,但没有运气

1 个答案:

答案 0 :(得分:3)

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

当您遍历文件中的行时,将它们拆分为&#34; |&#34;,您的结果实际上是一系列列表:

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()将返回迭代器而不是列表,因此您必须显式转换它:

token_count_tuples = list(token_counts.items())

Et viola,你的代币与他们各自的计数配对!

最后一点注意事项:您可能需要在代币上拨打str.strip(),因为我不认为按照&#34; |&#34;将删除单词和分隔符之间的空格。但这取决于您的真实数据是什么样的,以及您是否要考虑空格或不考虑空格。