繁体   English   中英

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

[英]Python - Match Words in Text File to Dictionary and Manipulate Value

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

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

我的字典是:

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

然后我想计算得分为8((2x5)-2 = 8)。 我可以在字典中找到出现的内容

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

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

任何帮助是极大的赞赏。

谢谢,斯科特

编辑:史蒂夫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一样的案例child -> childrenman -> men 这不容易或必然正确。

  • 我已经包含了.lower()来忽略你给出的字符串中的大小写。 如果您不想这样,只需删除该呼叫即可。

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

如果可能的话,使用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而没有复数。

对于陷入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版本。

这应该工作:

mtext =“狗是伟大的宠物,仓鼠是坏宠物。这就是为什么我想要一只狗”为Dict中的钥匙:p = re.compile('dog',re.IGNORECASE)NuOfDogs = len(p.findall(mtext) )#returns出现次数

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM