【问题标题】:In Python, how to check if words in a string are keys in a dictionary?在 Python 中,如何检查字符串中的单词是否是字典中的键?
【发布时间】:2017-03-10 17:32:04
【问题描述】:

对于一堂课,我说的是 twitter 情绪分析问题。我查看了网站上的其他问题,但它们对我的特定问题没有帮助。

我得到一个字符串,它是一条推文,其字母已更改,因此它们都是小写的。例如,

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

以及一个单词字典,其中键是单词,值是该单词的情绪值。更具体地说,key 可以是单个单词(例如 'hello')、多个以空格分隔的单词(例如 'yellow hornet')或连字符的复合词(例如 '2-dimensional' ) 或数字(例如“365”)。

我需要通过添加每个符合条件的单词的情绪并除以符合条件的单词的数量(通过符合条件的单词,我的意思是字典中的单词)来找到推文的情绪。我不确定检查推文是否在字典中有单词的最佳方法是什么。


我尝试使用“字符串中的键”约定循环遍历所有键,但这有问题,因为有很多键并且单词中的单词会被计算在内(例如,根除计数 cat、ate、era、等等)

然后我尝试使用 .split(' ') 并遍历结果列表的元素,但由于标点符号和键是两个词,我遇到了问题。

有人对我如何更合适地解决这个问题有任何想法吗?

例如:使用上面的示例,仍然:-0.625,love:0.625,其他单词都不在字典中。所以这应该返回 (-0.625 + 0.625)/2 = 0。

【问题讨论】:

  • @styvanesoukossi 我做到了。
  • 你能在这个输入和预期输出中显示关键吗??

标签: python


【解决方案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

当然,你必须有一些最大长度的词组,可能是通过字典的一次运行生成的,然后取出你的对、三元组等并检查它们。

【讨论】:

  • 我认为它的 has_key 和它在 python 3 中的贬值
  • 我相信这并不能解决标点符号的问题。例如,在上面的示例中,我们将有 'pizza)'。如果字典中有“pizza”这个词,它不会意识到,因为它会搜索“pizza)”。
  • @Hackaholic 在第二个例子中提到
  • 当然你想要word in wordsdict而不是使用has_keygetword.lower() 不需要,因为推文字符串已经全部小写了。
【解决方案2】:

你可以用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

【讨论】:

  • 谢谢,我会调查 nltk。虽然我在拆分时遇到的问题似乎仍然存在于 nltk 中。即,如果“地点”具有情绪值,则任何一种方法都不会检测到它,因为它是“地点”。而不是“地方”。
  • 是的,你现在明白了,NLTK 可以做得更好、更准确
  • 你可以做然后剥离更准确
  • @Soke 现在检查编辑,它将检测到“地点”。太
【解决方案3】:

按字典键的长度可能是一种解决方案。

例如,您的 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

【讨论】:

    猜你喜欢
    • 2011-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-12
    • 1970-01-01
    • 1970-01-01
    • 2021-04-11
    相关资源
    最近更新 更多