用Python编写法律

时间:2012-03-25 13:44:31

标签: python

我试图为给定的文本绘制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个令牌。 谢谢你的帮助!

3 个答案:

答案 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):