2014-12-03 2 views
1

Для класса я говорю с проблемой анализа настроений twitter. Я рассмотрел другие вопросы на сайте, и они не помогают в моей конкретной проблеме.В Python, как проверить, являются ли слова в строке ключами в словаре?

Мне дана строка, которая является одним твитом с измененными буквами, так что все они в нижнем регистре. Например,

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

, а также словарь слов, где ключевым является слово и является значение для настроения для этого слова. Чтобы быть более конкретным, ключ может быть одним словом (например, «привет»), более чем одним словом, разделенным пробелом (например, «желтый шершень») или дефинированным составным словом (например, «двумерным»,) или число (например, «365»).

Мне нужно найти настроение твита, добавив чувства для каждого подходящего слова и разделив на число подходящих слов (по подходящему слову, я имею в виду слово, которое находится в словаре). Я не уверен, что лучший способ проверить, имеет ли твит слово в словаре.


Я попытался с помощью «ключа в строке» конвенционный со сквозными через все ключи, но это было проблематично, потому что есть много ключей и слово-в-слова будут подсчитаны (например, уничтожить отсчитывает кошку, ел, эра и т. д.)

Затем я попытался использовать .split ('') и перейдя через элементы результирующего списка, но я столкнулся с проблемами из-за знаков препинания и ключей, которые являются двумя словами.

У кого-нибудь есть идеи о том, как я могу более эффективно справиться с этим?

Например: используя пример выше, все еще: -0.625, love: 0.625, каждое другое слово отсутствует в словаре. так что это должно вернуться (-0,625 + 0,625)/2 = 0.

+0

@styvanesoukossi я сделал. – MCT

+0

Вы можете показать ключ в этом вводе и ожидаемом выходе? – Hackaholic

ответ

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

+0

Я считаю, что это не устраняет проблему пунктуации. Например, в приведенном выше примере у нас будет «пицца» ». Если бы словарь имел «пиццу» как слово, он бы не понял, потому что он искал «пиццу»). – MCT

+0

@Hackaholic адресован во втором примере –

0

по длине словаря ключ может быть одним из решений.

Например, у вас есть Dict как:

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

+0

да, вы получили его сейчас, NLTK может сделать лучше и точнее – Hackaholic

+0

u можете сделать, затем стричь для более точного – Hackaholic

Смежные вопросы