我有一个词典,其中键是简单的单词,值是分数。我想基于单词的频率和存储在字典中的得分(值)与文件(或字符串)中的匹配单词相比来计算得分。例如,假设我的文字是:
“狗是很棒的宠物,仓鼠是坏宠物。这就是我想养狗的原因”
我的字典是:
Dict = {'dogs':5,'hampsters': - 2}
然后我想计算得分为8((2x5)-2 = 8)。我可以用
在字典中找到出现的内容 for key in Dict:
m = re.findall(key, READ , re.IGNORECASE)
但我无法以有用的方式访问密钥的值。
非常感谢任何帮助。
谢谢, 斯科特
答案 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 -> children
和man -> 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版本。