Python中的堆法则

2021-04-11 23:01:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图为一个给定的文本绘制堆的规律(它显示了词汇量的增长与文本长度的函数关系)。也就是说,对于每个标记,我需要文本的长度和词汇表的大小,直到给定的标记为止

我已经将我的文本标记化了,但是我被卡住了,因为我不知道如何迭代文本中的所有单词。在

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条回答
网友
1楼 ·

for word in tokens:可以满足您的需要。您不需要计数和中断-循环将在用完所有令牌后终止。
在循环中,您应该检查word变量并进行任何您想要的计数。

如果要计算不同的单词,可以使用set(tokens)
一个集合只能包含一次相同的单词,因此len(set(tokens))是不同单词的数目。您也可以在集合(for word in set(tokens):)上创建。在

网友
2楼 ·

您可以使用enumerate避免递增计数器:

uniq = set()

for i, token in enumerate(tokens):
    uniq.add(token)
    print "%d => %d" % (i, len(uniq))
网友
3楼 ·

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的答案。在

相关问题