2014-12-03 282 views
1

對於一堂課,我正在談論Twitter情緒分析問題。我查看了網站上的其他問題,並且他們對我的特定問題沒有幫助。在Python中,如何檢查字符串中的單詞是否是字典中的鍵?

我給出了一個字符串,它是一個tweet,其字母已更改,以便它們都是小寫字母。例如,

'after 23 years i still love this place. (@ tel aviv kosher pizza) http://t.co/jklp0uj' 

以及關鍵字是單詞的字典和值是該單詞的情感值。更具體地說,一個關鍵詞可以是一個單詞(如'hello'),由空格分隔的多個單詞(如'黃色大黃蜂')或連字符複合詞(如'2維' )或一個數字(如'365')。

我需要通過爲每個符合條件的單詞添加情感併除以符合條件的單詞數量(按照符合條件的單詞,我指的是詞典中的單詞)來查找推文的情緒。我不確定要查看推文是否在詞典中有詞,最好的方法是什麼。


我使用約定的「在字符串鍵」通過所有鍵循環試過了,但是這是有問題的,因爲有很多按鍵和字的字將被計數的(如根除計數貓,吃飯,時代等等)

然後我嘗試使用.split('')和循環的結果列表中的元素,但由於標點符號和兩個單詞的關鍵,我遇到了問題。

任何人有任何想法,我可以更合適地解決這個問題?

例如:使用上面的例子,仍然是:-0.625,love:0.625,其他單詞不在字典中。所以這應該返回(-0.625 + 0.625)/ 2 = 0

+0

@styvanesoukossi我做到了。 – MCT 2014-12-03 05:58:13

+0

你能在這個輸入和期望的輸出中顯示關鍵嗎? – Hackaholic 2014-12-03 06:01:15

回答

0

字典整點是,他們很快在找東西:

for word in instring.split(): 
    if wordsdict.has_key(word): 
     print word 

你可能會做在擺脫更好標點符號等,(謝謝你,Soke),通過使用正則表達式而不是分割,例如

for word in re.findall(r'[\w]', instring): 
    if wordsdict.get(word) is not None: 
     print word 

當然,你將不得不通過字典中有單詞分組,可能與單次運行中產生的一些最大長度,然後把你的雙,三人間等,還要檢查他們。

+1

我認爲它的'has_key'和它的貶值python 3 – Hackaholic 2014-12-03 06:02:42

+0

我認爲這不能解決標點問題。例如,在上面的例子中,我們會有'披薩')。如果字典有「比薩餅」這個詞,它就不會意識到,因爲它會搜索'披薩')。 – MCT 2014-12-03 06:05:53

+0

@Hackaholic在第二個例子中提到了 – 2014-12-03 06:12:50

0

根據詞典密鑰的長度可能是一個解決方案。

例如,你有字典爲:

Sentimentdict = {"habit":5, "bad habit":-1} 

一句話可能是:

S1 = 「他有好習慣」 S2 = 「他有壞習慣」

s1應該比s2好點。現在,你可以這樣做:

for w in sorted(Sentimentdict.keys(), key=lambda x: len(x)): 
    if w in s1: 
     remove the word and do your sentiment calculation 
0

可以使用nltk其非常強大的,你想要做的,它可以通過split太做什麼:

>>> import string 
>>> a= 'after 23 years i still love this place. (@ tel aviv kosher pizza) http://t.co/jklp0uj' 
>>> import nltk 
>>> my_dict = {'still' : -0.625, 'love' : 0.625} 
>>> words = nltk.word_tokenize(a) 
>>> words 
['after', '23', 'years', 'i', 'still', 'love', 'this', 'place.', '(', '@', 'tel', 'aviv', 'kosher', 'pizza', ')', 'http', ':', '//t.co/jklp0uj'] 
>>> sum(my_dict.get(x.strip(string.punctuation),0) for x in words)/2 
0.0 

使用split

>>> words = a.split() 
>>> words 
['after', '23', 'years', 'i', 'still', 'love', 'this', 'place.', '(@', 'tel', 'aviv', 'kosher', 'pizza)', 'http://t.co/jklp0uj'] 
>>> sum(my_dict.get(x.strip(string.punctuation),0) for x in words)/2 
0.0 

my_dict.get(key,default),所以get將返回值,如果在字典中找到鍵,否則它將返回默認值。在這種情況下, '0'

檢查這個例子:你問place

>>> import string 
>>> my_dict = {'still' : -0.625, 'love' : 0.625,'place':1} 
>>> a= 'after 23 years i still love this place. (@ tel aviv kosher pizza) http://t.co/jklp0uj' 
>>> words = nltk.word_tokenize(a) 
>>> sum(my_dict.get(x.strip(string.punctuation),0) for x in words)/2 
0.5 
+0

謝謝我會考慮nltk。雖然我分裂的問題似乎仍然與nltk發生。也就是說,如果「地點」具有情感價值,則無論使用哪種方法都不會檢測到它,因爲它是「地點」。而不是「地點」。 – MCT 2014-12-03 06:18:15

+0

是的,你現在得到它,NLTK可以做的更好,更準確 – Hackaholic 2014-12-03 06:20:10

+0

你可以做,然後剝離更準確 – Hackaholic 2014-12-03 06:21:06

相關問題