首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Python中的堆规则

Python中的堆规则
EN

Stack Overflow用户
提问于 2012-03-25 21:44:31
回答 3查看 1.6K关注 0票数 1

我正在尝试为给定的文本绘制堆定律(它显示了词汇表大小随文本长度的函数增长)。也就是说,对于每个标记,我需要文本的长度和给定标记的词汇表大小

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

代码语言:javascript
代码运行次数:0
运行
复制
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个令牌。谢谢你的帮忙!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-03-25 21:54:43

tokens是由NLTK填充一次的数组。它不会随着你的迭代而增长,所以len(tokens)在每次迭代中都是一样的。因为您已经在i中累积了计数。使用它而不是len(tokens)

对于唯一计数,您也有同样的问题。set(tokens)总是完整的集合,而不是您到目前为止已经遍历过的集合。你需要边走边累积这组已知的单词:

代码语言:javascript
代码运行次数:0
运行
复制
i = 0
words = set()
for word in tokens:
    words.add(word)
    i += 1
    print i, len(words)

编辑:愚蠢的我忘记了枚举。有关如何避免显式计算i的信息,请参阅Dvir Volk的答案。

票数 1
EN

Stack Overflow用户

发布于 2012-03-25 21:56:09

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

代码语言:javascript
代码运行次数:0
运行
复制
uniq = set()

for i, token in enumerate(tokens):
    uniq.add(token)
    print "%d => %d" % (i, len(uniq))
票数 4
EN

Stack Overflow用户

发布于 2012-03-25 21:54:46

for word in tokens:可以满足您的所有需求。您不需要计数和中断-循环将在所有令牌耗尽后终止。

在循环中,您应该检查word变量并执行所需的任何计数。

如果你想计算不同的单词,你可以使用set(tokens)

一个集合只能包含同一个单词一次,因此len(set(tokens))是不同单词的数量。您还可以迭代集合(for word in set(tokens):

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9860606

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档