我正在尝试为给定的文本绘制堆定律(它显示了词汇表大小随文本长度的函数增长)。也就是说,对于每个标记,我需要文本的长度和给定标记的词汇表大小
我已经对我的文本进行了标记化,但我被卡住了,因为我不知道如何迭代文本中的所有单词。
tokens=nltk.wordpunct_tokenize(text)
it=len(tokens)
i=1
for word in tokens:
print len(tokens), len(set(tokens))
i=i+1
if i>it:
break
我基本上需要在每次迭代中让文本增长1个令牌。谢谢你的帮忙!
发布于 2012-03-25 21:54:43
tokens
是由NLTK填充一次的数组。它不会随着你的迭代而增长,所以len(tokens)
在每次迭代中都是一样的。因为您已经在i
中累积了计数。使用它而不是len(tokens)
。
对于唯一计数,您也有同样的问题。set(tokens)
总是完整的集合,而不是您到目前为止已经遍历过的集合。你需要边走边累积这组已知的单词:
i = 0
words = set()
for word in tokens:
words.add(word)
i += 1
print i, len(words)
编辑:愚蠢的我忘记了枚举。有关如何避免显式计算i
的信息,请参阅Dvir Volk的答案。
发布于 2012-03-25 21:56:09
您可以使用enumerate
来避免递增计数器:
uniq = set()
for i, token in enumerate(tokens):
uniq.add(token)
print "%d => %d" % (i, len(uniq))
发布于 2012-03-25 21:54:46
for word in tokens:
可以满足您的所有需求。您不需要计数和中断-循环将在所有令牌耗尽后终止。
在循环中,您应该检查word
变量并执行所需的任何计数。
如果你想计算不同的单词,你可以使用set(tokens)
。
一个集合只能包含同一个单词一次,因此len(set(tokens))
是不同单词的数量。您还可以迭代集合(for word in set(tokens):
。
https://stackoverflow.com/questions/9860606
复制相似问题