2010-12-19 75 views
1

我有一个字典,其中的键是简单的词,值是一个分数。我想根据单词的频率和字典中存储的分数(值)与文件(或字符串)中的mathed单词进行比较来计算分数。例如,假设我的文字是:Python - 将文本文件中的单词匹配到词典和操作值

“狗是伟大的宠物仓鼠是坏宠物这就是为什么我想要一只狗。”

我的字典是:

快译通= {“狗”: 5,'hampsters':-2}

然后我想计算8((2x5)-2 = 8)的分数。我能找到在词典中出现次数与

for key in Dict: 
    m = re.findall(key, READ , re.IGNORECASE) 

,但我一直无法访问有用的方式的关键价值。

任何帮助,非常感谢。

谢谢, 斯科特

+2

“狗”这个词只在该字符串中出现一次;另一个词是'狗'。除非您使用多元化库,否则计算机不知道这两个词在某种意义上是“相同的”这一事实。 – katrielalex 2010-12-19 22:51:56

+0

仔细调用一个变量'Dict'因为大写字母'D',所以在这种情况下可以,但是如果你调用变量'dict',你就会抛出内建的字典构造函数。 – 2012-06-25 19:56:02

回答

3

编辑:史蒂夫V激发了以下内容,这是相当漂亮:

sentence = "...".split() 
score = sum(sentence.count(word) * score for word, score in scores.items()) 

强制性单行:

>>> s = "Dogs are great pets and hamsters are bad pets. That is why I want a dog." 
>>> scores = {'dogs': 5, 'hamsters': -2} 
>>> import collections 
>>> sum(scores.get(word.lower(), 0) * freq for word, freq in collections.Counter(s.split()).items()) 
3 

和分割up:

>>> sum = 0 
>>> counts = collections.Counter(s.split()) 
>>> for word, freq in counts.items(): 
...  sum += scores.get(word.lower(), 0) * freq 
... 
>>> sum 
3 

显着特点:

  • 的分数是不是8(如你声称以上),但3,因为这个词dogs只出现你给字符串中的一次。如果要计算dog这个词两次,则需要一个(更多)更复杂的算法,可能需要与复合库进行连接以处理像child -> childrenman -> men这样的情况。这并不容易,也不一定正确。

  • 我已包括.lower()忽略您输入字符串的大小写。如果你不想要这个,只需删除电话。

  • 你错过了“仓鼠”:p。

+0

请注意,在Python 2中不起作用(collections.Counter未在2.x中实现) – 2010-12-19 23:11:11

+0

@Steve:适用于2.7,即当前版本,尽管它在2.7中是新增功能。 – katrielalex 2010-12-19 23:15:09

+0

@katrielalex:啊,我明白了。我没有意识到http://docs.python.org/dev/library/collections.html中的“3.1新版本”指的是 – 2010-12-19 23:25:41

0

这应该工作:

多行文字=“狗是伟大的宠物仓鼠是坏宠物这就是为什么我想要一只狗。” 关键在词典: P = re.compile(”狗',re.IGNORECASE) NuOfDogs = len(p.findall(mtext))#returns发生次数

1

如果可能,请使用katrielalex的答案,它比我的要干净。如果你没有Python 2。7(像我一样),这可能会为你工作:

sentence = "Dogs are great pets and hamsters are bad pets. That is why I want a dog" 

scores = {'dog' : 5, 'hamster' : -2} 

occurrences = {} 

for key in scores: 
    m = re.findall(key, sentence , re.IGNORECASE) 
    occurrences[key] = len(m) 

totalScore = 0 

for word in occurrences: 
    totalScore += scores.get(word.lower(), 0) * occurrences[word] 

print totalScore 

我做“狗” - >“狗”在你的分数的字典,假设它是一个错字。如果你改回来,你的结果将是3没有多元化。

+0

非常感谢,这很好。 – Scott 2010-12-23 17:46:31

0

的人坚持使用Python 2.6 katrielalex的回答的另一个变化,

把这个片断在一个文件中(counter.py为例):http://code.activestate.com/recipes/576611/

那么你可以使用下面的代码:

from counter import Counter 

counts = Counter(text.split()) 
for word, freq in counts.items(): 
    sum += scores.get(word.lower(), 0) * freq 
... 

几乎相同,只是它适用于较旧的Python版本。