Python - 将文本文件中的单词与字典匹配并操纵值

时间:2010-12-19 22:35:36

标签: python dictionary

我有一个词典,其中键是简单的单词,值是分数。我想基于单词的频率和存储在字典中的得分(值)与文件(或字符串)中的匹配单词相比来计算得分。例如,假设我的文字是:

“狗是很棒的宠物,仓鼠是坏宠物。这就是我想养狗的原因”

我的字典是:

Dict = {'dogs':5,'hampsters': - 2}

然后我想计算得分为8((2x5)-2 = 8)。我可以用

在字典中找到出现的内容
    for key in Dict: 
    m = re.findall(key, READ , re.IGNORECASE)

但我无法以有用的方式访问密钥的值。

非常感谢任何帮助。

谢谢, 斯科特

4 个答案:

答案 0 :(得分: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

并分手:

>>> 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。

答案 1 :(得分: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而没有多元化。

答案 2 :(得分:0)

这应该有效:

mtext =“狗是很棒的宠物,仓鼠是坏宠物。这就是为什么我想要一只狗” 关键词:     p = re.compile('dog',re.IGNORECASE)     NuOfDogs = len(p.findall(mtext))#returns出现次数

答案 3 :(得分:0)

katrielalex的另一个变体是对那些坚持使用Python 2.6的人的回答,

将此代码段放在一个文件中(例如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版本。