Python - 在文本文件中匹配单词到字典并操作值

1 投票
4 回答
3477 浏览
提问于 2025-04-16 08:45

我有一个字典,这个字典的键是一些简单的单词,而值是对应的分数。我想根据单词出现的频率和字典中存储的分数来计算一个总分,这个计算是基于在一个文件或字符串中找到的匹配单词。例如,假设我的文本是:

“狗是很棒的宠物,而仓鼠是糟糕的宠物。这就是我想要一只狗的原因。”

我的字典是:

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

那么我想计算的总分是8((2x5)-2 = 8)。我可以通过以下方式找到字典中的单词出现次数:

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

但是我还没有找到一个有用的方法来获取键对应的值。

任何帮助都非常感谢。

谢谢,
斯科特

4 个回答

0

这段代码应该可以正常运行:

首先,mtext 这个变量里存了一段话:“狗是很棒的宠物,而仓鼠则不是。这就是我想要一只狗的原因。”

接下来,代码会对一个叫 Dict 的东西进行循环(虽然这里没有具体说明 Dict 是什么)。

然后,使用 re.compile('dog', re.IGNORECASE) 这行代码来创建一个可以找到“dog”这个词的规则,并且不管字母是大写还是小写都能找到。

最后,NuOfDogs 这个变量会计算出 mtext 里有多少次出现“dog”这个词。也就是说,这行代码会返回“dog”出现的次数。

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

我在你的分数字典里把“dogs”改成了“dog”,是因为我猜这是个打字错误。如果你把它改回来,结果会是3,而不是复数形式。

3

编辑:Steve 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() 这个方法来忽略你给的字符串中的大小写。如果你不想这样,可以直接把这个方法去掉。

  • 你把“hamster”拼错了 :p。

撰写回答