2010-12-19 77 views
1

我有一個字典,其中的鍵是簡單的詞,值是一個分數。我想根據單詞的頻率和字典中存儲的分數(值)與文件(或字符串)中的mathed單詞進行比較來計算分數。例如,假設我的文字是:Python - 將文本文件中的單詞匹配到詞典和操作值

「狗是偉大的寵物倉鼠是壞寵物這就是爲什麼我想要一隻狗。」

我的字典是:

快譯通= {「狗」: 5,'hampsters':-2}

然後我想計算8((2x5)-2 = 8)的分數。我能找到在詞典中出現次數與

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

,但我一直無法訪問有用的方式的關鍵價值。

任何幫助,非常感謝。

謝謝, 斯科特

+2

「狗」這個詞只在該字符串中出現一次;另一個詞是'狗'。除非您使用多元化庫,否則計算機不知道這兩個詞在某種意義上是「相同的」這一事實。 – katrielalex 2010-12-19 22:51:56

+0

仔細調用一個變量'Dict'因爲大寫字母'D',所以在這種情況下可以,但是如果你調用變量'dict',你就會拋出內建的字典構造函數。 – 2012-06-25 19:56:02

回答

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 

和分割up:

>>> 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()忽略您輸入字符串的大小寫。如果你不想要這個,只需刪除電話。

  • 你錯過了「倉鼠」:p。

+0

請注意,在Python 2中不起作用(collections.Counter未在2.x中實現) – 2010-12-19 23:11:11

+0

@Steve:適用於2.7,即當前版本,儘管它在2.7中是新增功能。 – katrielalex 2010-12-19 23:15:09

+0

@katrielalex:啊,我明白了。我沒有意識到http://docs.python.org/dev/library/collections.html中的「3.1新版本」指的是 – 2010-12-19 23:25:41

0

這應該工作:

多行文字=「狗是偉大的寵物倉鼠是壞寵物這就是爲什麼我想要一隻狗。」 關鍵在詞典: P = re.compile(」狗',re.IGNORECASE) NuOfDogs = len(p.findall(mtext))#returns發生次數

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沒有多元化。

+0

非常感謝,這很好。 – Scott 2010-12-23 17:46:31

0

的人堅持使用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版本。