我一直在尝试使用数据集,其中|
作为分隔符,\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
,但没有运气
答案 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;将删除单词和分隔符之间的空格。但这取决于您的真实数据是什么样的,以及您是否要考虑空格或不考虑空格。