用Python计算文档中唯一的单词数

用Python计算文档中唯一的单词数,python,Python,我是一名Python新手,试图理解对文档中唯一单词的计数问题给出的答案。答案是: print len(set(w.lower() for w in open('filename.dat').read().split())) 将整个文件读入内存,使用 空白,将每个单词转换为小写,创建一个(唯一)集 从小写单词中,对其进行计数并打印输出 为了理解这一点,我正在尝试用Python一步一步地实现它。我可以使用open and read导入文本平铺,使用split将其拆分为单个单词,并使用lower将其

我是一名Python新手,试图理解对文档中唯一单词的计数问题给出的答案。答案是:

print len(set(w.lower() for w in open('filename.dat').read().split()))
将整个文件读入内存,使用 空白,将每个单词转换为小写,创建一个(唯一)集 从小写单词中,对其进行计数并打印输出

为了理解这一点,我正在尝试用Python一步一步地实现它。我可以使用open and read导入文本平铺,使用split将其拆分为单个单词,并使用lower将其全部小写。我还可以在列表中创建一组独特的单词。然而,我不知道如何做最后一部分-计算唯一单词的数量

我想我可以通过遍历唯一单词集中的项目并在原始小写列表中计算它们来完成,但是我发现集合结构是不可索引的

所以我想用自然语言做一些事情,比如,对于集合中的所有项目,告诉我它们在小写列表中出现了多少次。但我不太明白如何做到这一点,我怀疑对Python的一些潜在误解正在阻碍我

  • 编辑-

谢谢你们的回答。我刚刚意识到,我没有正确地解释自己——我不仅想找到唯一单词的总数(我理解的是集合的长度),还想找到每个单词被使用的次数,例如,“the”被使用了14次,“was”被使用了9次,“it”被使用了20次等等。抱歉造成混淆。

您可以使用
len(我的集合)
len(我的列表)
计算集合、列表或元组中的项数

编辑:计算一个单词的使用次数是不一样的。
以下是显而易见的方法:

count = {}
for w in open('filename.dat').read().split():
    if w in count:
        count[w] += 1
    else:
        count[w] = 1
for word, times in count.items():
    print "%s was found %d times" % (word, times)

如果您想避免使用If子句,可以查看。

您的问题已经包含了答案。如果
s
是文档中唯一单词的集合,则
len(s)
给出集合中元素的数量,即文档中唯一单词的数量。

A根据定义,包含唯一元素(在您的情况下,您无法在此处两次找到相同的“小写字符串”)。所以,你要做的就是简单地得到集合中元素的计数=集合的长度=
len(集合(…)

我想说,代码计算的是不同单词的数量,而不是唯一单词的数量,唯一单词的数量是只出现一次的单词数量

这计算每个单词出现的次数:

from collections import defaultdict

word_counts = defaultdict(int)

for w in open('filename.dat').read().split():
    word_counts[w.lower()] += 1

for w, c in word_counts.iteritems():
    print w, "occurs", word_counts[w], "times"
我相信这就是你在这种情况下所需要的:

from collections import Counter

print Counter(yourtext.split())
你们可以用柜台

from collections import Counter
c = Counter(['mama','papa','mama'])
c的结果将是

Counter({'mama': 2, 'papa': 1})

为什么不使用字典从一个单词映射到另一个单词呢?不需要遍历集合来计算唯一单词的数量。这就是
len
函数所做的-它给出了集合的长度。
unique\u word\u count=len(你的集合)
有什么问题吗?s.洛特-我想你的建议就是我真正的意思,请参见上述问题中的编辑。这难道不会将出现在句子末尾的同一个单词与出现在句子中间的同一个单词算作两个不同的独特单词吗?这不是你想要的行为。例如,“traffic”和“traffic.”将被视为单独的唯一单词。@Geomind当然,这是一种有点幼稚的方法。但问题的主题是关于数词。你可能需要付出额外的努力来确保你数到了正确的单词。顺便说一句,今天我认为Artsioms的答案(使用collections.Counter)要好得多。这是2011年@ArtsiomRudzenka答案的重复,唯一的区别是结果显示在这里,必须是编辑或评论,而不是答案。(我知道你不能在低于50分的情况下这样做)。不过:你的答案是重复的。