0

我一直在尝试使用具有|分隔符和\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,但没有运气

4

1 回答 1

3

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

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

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()你的令牌,因为我不认为用“|”分割 将删除单词和分隔符之间的空格。但这取决于您的真实数据是什么样的,以及您是否要考虑空格。

于 2016-05-12T05:44:06.530 回答