如何计算另一个.txt文件中项目列表的出现次数?

如何计算另一个.txt文件中项目列表的出现次数?

问题描述:

我有一个单词列表,我想查找它们出现在.txt文件中的次数。单词列表是一样的东西如下:如何计算另一个.txt文件中项目列表的出现次数?

wordlist = ['cup', 'bike', 'run'] 

我希望不仅能够拿起这些话,但还搞什么CUP,骑自行车,跑步,杯子等,所以我想我需要一个正表达。这是我在想什么,但它不起作用:

len(re.findall(wordlist, filename, re.I)) 

在此先感谢!

你很近。但re.findall需要一个模式和一个字符串,而不是一个单词表和一个文件名。

但是,如果您将文件读入一个字符串并将您的文字列表转换为模式,那么您就会得到它。

您需要的图案如下所示:r"cup|bike|run"。你可以做"|".join(wordlist)得到这个。

这是计算所有这些实例的非常松散的方式。请注意,如果您的文件中包含“我的警棍已被盗用”字样,则re.findall将在较大的单词内找到“运行”和“杯子”。所以你可能想调整你的模式来捕捉单词的开始和结尾。

要获取整个单词,请使用以下模式:r"\b(cup|bike|run)\b"。当然,你需要填写你正在寻找的所有单词。

+1

即使添加单词调整的开始和结束,仍然会有不应该被发现的单词(例如,“打嗝”,“矮胖”等)。也许使用WordNet或其他字典的东西来找到一个词的所有不同形式,然后在搜索词的两边使用词边界... – tgray 2010-06-25 18:48:51

+0

谢谢,@tgray。我调整了我的答案,以包含匹配整个单词的模式。 – eksortso 2010-06-25 19:24:37

+1

谢谢eksortso!我不明白模式/字符串的区别,现在我明白了。我实际使用的单词列表是由更长的单词组成的,所以我不应该遇到与杯子一起出现的奇怪问题并运行,但我一定会更多地考虑只用整个单词。谢谢! – dandyjuan 2010-06-25 20:12:31

正则表达式的工作需要,但这应该让你开始:

from __future__ import with_statement # only if < 2.6 
from collections import defaultdict 
import re 

matches = defaultdict(int) 
with open(filename) as f: 
    for mtch in re.findall(r'\b(cup|bike|run)', f.read(), re.I): 
     matches[mtch.lower()] += 1 
+0

目前还不清楚是什么你在做什么是必要的。当OP说“发生了多少次”时,你解决的是“每次发生多少次*” - 在我看来,不需要单独计数。同时只检查\ b单词的开始是麻烦 - 它会在* cupid *中找到* cup *,*在* rune *中* run *,* *在肉中*等等 – 2010-06-27 19:49:40

您必须首先猜测各种形式的话,并且似乎PITA。但这里是一个简化的FN我读http://www.theenglishspace.com/spelling/后写道:

def getWordForms(word): 
    ''' Given an English word, return list of possible forms 
    ''' 
    l = [word] 
    if len(word)>1: 
     l.extend([word + 's', word + 'ing', word + 'ed']) 
     wor, d = word[:-1], word[-1:] 
     if d == 'e': 
      l.append(word + 'd') 
      l.append(wor + 'ing') 
      if wor[-1:] == 'f': 
       l.append(wor[:-1] + 'ves') 
     elif d == 'y': 
      l.append(wor + 'ied') 
      l.append(wor + 'ies') 
     elif d == 'z': 
      l.append(word + 'zes') # double Z 
     elif d == 'f': 
      l.append(wor + 'ves') 
     elif d in 'shox': 
      l.append(word + 'es') 
     if re.match('[^aeiou][aeiou][^aeiou]', word): 
      l.append(word + d + 'ing') # double consonant 
      l.append(word + d + 'ed') 
    return l 

它是猜测的话的变种过于慷慨 - 但是,这是确定的,因为这不是一个拼写检查器,你将使用\ b。对于两边的词边界。