文本中出现频率最高的词,不包括特定长度的词

Most frequent words from text excluding words that are of certain length

我遇到了问题,找不到解决方案,也许有人可以提供帮助。我有一首诗,我能够显示最常见的单词,尽管我希望所有长度少于 5 个字符的字符串都不会显示在我的前 20 个最常见的列表中。

import collections

import re

words = re.findall(r'\w+', open('some_poem.txt').read().lower())
most_common = collections.Counter(words).most_common(20)


print(most_common)

是否有一种简洁明了的方法来添加此类功能?不显示 5 个或更少字符的字符串?提前致谢

一个Counter只是一个字典,所以我们可以使用dict comprehension来过滤我们需要的结果:

{ k: v for k, v in most_common.items() if v > 5 }

如果 "shorter than 5" 你的意思是 "less than 5 characters long" 你可以改变你的正则表达式而不是首先 return 这些词,使用 {5,} (五个或更多)而不是 +(一个或多个):

words = re.findall(r'\w{5,}', open('some_poem.txt').read().lower())

以下是不是你要求的,但取决于你真正想要什么,它可能更有用,得到一个set of [=17] =] 并从单词列表中过滤掉这些单词,因为很可能 "relevant" 个单词少于五个字母,而不相关的单词则更多。

stop_words = set("a,able,about,across,...,you,your".split(","))
words = re.findall(r'\w+', open('some_poem.txt').read().lower())
words = [word for word in words if word not in stop_words]

此外,为了完整起见,如评论中所述,您应该养成使用 with 打开文件的习惯,以确保它们随后正确关闭。

with open('some_poem.txt') as f:
    words = re.findall(r'\w{5,}', f.read().lower())