我试图为给定的文本绘制Heaps法则(它显示了词汇大小随文本长度变化的增长)。也就是说,对于每个令牌,我需要文本的长度和词汇量大小直到给定的令牌
我已经对我的文字进行了标记,但我被卡住了,因为我不知道如何迭代文本中的所有单词。
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个令牌。 谢谢你的帮助!
答案 0 :(得分:3)
您可以使用enumerate
来避免增加计数器:
uniq = set()
for i, token in enumerate(tokens):
uniq.add(token)
print "%d => %d" % (i, len(uniq))
答案 1 :(得分:1)
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)
编辑:傻我忘记了枚举。请参阅Dvir Volk关于如何明确避免计算i
的答案。
答案 2 :(得分:1)
for word in tokens:
可以满足您的所有需求。你不需要计算和破坏 - 在所有令牌都用完之后循环将终止
在循环内部,您应该检查word
变量并做任何您想要的计数。
如果您想计算不同的字词,可以使用set(tokens)
一个集合只能包含一次相同的单词,因此len(set(tokens))
是不同单词的数量。您还可以迭代集合(for word in set(tokens):
。