Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-将文本文件中的单词匹配到字典并操纵值_Python_Dictionary - Fatal编程技术网

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

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) 但我

我有一本字典,其中键是简单的单词,值是分数。我想根据单词的频率和字典中存储的分数(值)与文件(或字符串)中的匹配单词进行比较来计算分数。例如,假设我的文本是:

“狗是好宠物,仓鼠是坏宠物。这就是我想要狗的原因”

我的字典是:

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

然后我想计算8分((2x5)-2=8)。我能在字典里找到一些有意思的事

    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

这应该可以:

mtext=“狗是好宠物,仓鼠是坏宠物。这就是我想要狗的原因” 对于输入Dict: p=re.compile('dog',re.IGNORECASE) numofdogs=len(p.findall(mtext))#返回发生次数

这应该可以:

mtext=“狗是好宠物,仓鼠是坏宠物。这就是我想要狗的原因” 对于输入Dict: p=re.compile('dog',re.IGNORECASE)
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!