Python-将文本文件中的单词匹配到字典并操纵值
我有一本字典,其中键是简单的单词,值是分数。我想根据单词的频率和字典中存储的分数(值)与文件(或字符串)中的匹配单词进行比较来计算分数。例如,假设我的文本是: “狗是好宠物,仓鼠是坏宠物。这就是我想要狗的原因” 我的字典是: Dict={'dogs':5,'hampster':-2} 然后我想计算8分((2x5)-2=8)。我能在字典里找到一些有意思的事Python-将文本文件中的单词匹配到字典并操纵值,python,dictionary,Python,Dictionary,我有一本字典,其中键是简单的单词,值是分数。我想根据单词的频率和字典中存储的分数(值)与文件(或字符串)中的匹配单词进行比较来计算分数。例如,假设我的文本是: “狗是好宠物,仓鼠是坏宠物。这就是我想要狗的原因” 我的字典是: Dict={'dogs':5,'hampster':-2} 然后我想计算8分((2x5)-2=8)。我能在字典里找到一些有意思的事 for key in Dict: m = re.findall(key, READ , re.IGNORECASE) 但我
for key in Dict:
m = re.findall(key, READ , re.IGNORECASE)
但我无法以有用的方式访问密钥的值
非常感谢您的帮助
谢谢,
斯科特编辑:史蒂夫五世启发了以下几点,这是相当不错的:
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
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
NuOfDogs=len(p.findall(mtext))#返回发生次数尽可能使用Katrielex的答案,它比我的答案更干净。如果您没有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而不是复数。尽可能使用Katrielex的答案,它比我的答案更干净。如果您没有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而不是复数。Katrielex的答案的另一个变体,适用于那些坚持使用Python 2.6的人 将此代码段放入文件(例如counter.py): 然后可以使用以下代码:
from counter import Counter
counts = Counter(text.split())
for word, freq in counts.items():
sum += scores.get(word.lower(), 0) * freq
...
基本相同,只是它适用于较旧的Python版本。Katrielex的答案的另一个变体,适用于坚持使用Python 2.6的用户 将此代码段放入文件(例如counter.py): 然后可以使用以下代码:
from counter import Counter
counts = Counter(text.split())
for word, freq in counts.items():
sum += scores.get(word.lower(), 0) * freq
...
几乎相同,只是它适用于较旧的Python版本。单词
dogs
在该字符串中只出现一次;另一个词是dog
。这两个词在某种意义上是“相同”的事实,计算机不知道,除非您使用多元化库。小心调用变量Dict
,在这种情况下,您是可以的,由于大写字母“D”,但如果调用变量dict
,则会破坏内置的dict构造函数。单词dogs
在该字符串中只出现一次;另一个词是dog
。这两个词在某种意义上是“相同”的事实,计算机不知道,除非你使用多元化库。小心调用变量Dict
,在这种情况下你是可以的,因为大写字母是“D”,但如果你调用变量Dict
,你就破坏了内置的Dict构造函数。请注意,在Python2中不起作用(collections.Counter未在2.x中实现)@Steve:在当前版本的2.7中起作用,尽管它在2.7中是新版本。@KatrieleAlex:啊,我明白了。我不知道“新版本3.1”指的是哪一部分to@SteveV:从URL中删除dev/
,您将获得Python 2.x文档。您链接的页面显示它在Python3.1中对于3.x系列是新的。每天在这个网站上学习一些新的东西。谢谢@Greg!请注意,在Python2中不起作用(collections.Counter未在2.x中实现)@Steve:在当前版本的2.7中起作用,尽管它在2.7中是新版本。@KatrieleAlex:啊,我明白了。我不知道“新版本3.1”指的是哪一部分to@SteveV:从URL中删除dev/
,您将获得Python 2.x文档。您链接的页面显示它在Python3.1中对于3.x系列是新的。每天在这个网站上学习一些新的东西。谢谢@Greg!