拆分 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()
,因为我不认为按“|”拆分将删除单词和分隔符之间的空格。但这取决于您的真实数据是什么样子以及您是否要考虑空格。
我一直在尝试使用以 |
作为分隔符并以 \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()
,因为我不认为按“|”拆分将删除单词和分隔符之间的空格。但这取决于您的真实数据是什么样子以及您是否要考虑空格。