对于一堂课,我说的是Twitter情绪分析问题。我查看了网站上的其他问题,但他们对我的特定问题没有帮助。
我收到一个字符串,它是一条推文,其字母已更改,因此它们都是小写的。例如,
'after 23 years i still love this place. (@ tel aviv kosher pizza) http://t.co/jklp0uj'
以及单词词典,其中键是单词,值是该单词的情绪值。更具体地说,一个键可以是一个单词(例如' hello'),多个单词由空格分隔(例如黄色大黄蜂'),或带连字符复合词(例如' 2维')或数字(例如' 365')。
我需要通过添加每个符合条件的单词的情感并除以符合条件的单词的数量来找到推文的情绪(通过符合条件的单词,我的意思是字典中的单词)。我不确定检查推文是否在字典中有单词的最佳方式。
我尝试在字符串中使用"键"循环遍历所有键的约定,但这是有问题的,因为有很多键和词汇将被计算(例如根除计数猫,吃,时代等)
然后我尝试使用.split('')并循环遍历结果列表的元素,但由于标点符号和两个单词的键,我遇到了问题。
任何人对我如何更适合解决这个问题有任何想法?
例如:使用上面的例子,仍然:-0.625,爱情:0.625,其他每个单词都不在字典中。所以这应该返回(-0.625 + 0.625)/ 2 = 0。
答案 0 :(得分:1)
词典的全部意义在于他们能够快速查找:
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 :(得分:0)
按字典键的长度输出可能是一种解决方案。
例如,你有dict为:
Sentimentdict = {"habit":5, "bad habit":-1}
句子可能是:
s1 ="他有良好的习惯" s2 ="他有坏习惯"
与s2相比,s1应该会获得良好的情绪。现在,您可以这样做:for w in sorted(Sentimentdict.keys(), key=lambda x: len(x)):
if w in s1:
remove the word and do your sentiment calculation
答案 2 :(得分: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