从python中的列表中选择包含特定单词的特定元素

时间:2016-04-29 16:16:01

标签: python list sentiment-analysis

我想做一个情绪分析,但只想使用包含某个单词的列表元素。这是关于评论的,我只想分析那些

的评论

例如,我的列表是:

comments = ["nice blog","i like your blog","nivea is a nice product","i like nivea"]

如何创建一个列表,其中只添加包含“nivea”一词的评论?

所以我希望我的最终名单是:

commentsfinal = ["nivea is a nice product","i like nivea"]

我试着用不同的方式计算评论的总数(所以不是nivea提及的总量,但实际上是评论)。所有不同的方式导致了不同的结果,任何人都可以帮助我哪一个是正确的,为什么?

首先尝试:

niveaucountlist=[]
match="nivea"

for comment in allcomments:
    niveacount=0
    for word in comment.split():
        if word in match:
            niveacount+=1
        niveacountlist.append(niveacount)

total=sum(niveacount)

这让我得到了4547评论的结果

第二次尝试: 我尝试的第二件事就是制作一个清单,每个评论的价值都与提到妮维雅的总次数有关。 我得到了一个列表:

niveacountlist=[1,0,0,1,2,0]

然后我删除了所有值为零的元素(因为这些是与nivea无关的注释

niveacountlistpos=[x for x in niveacountlist if x != 0]
print(len(niveacountlistpos))

这导致了3771条评论..

上次尝试: 我的最后一次尝试就是你们在第一个问题中回答我的问题。所以我使用了regexp并做了:

import re
nivealist=[x for x in allcomments if re.search("nivea",x)]

这导致了2583条评论..

那么,这里发生了什么?有人可以解释一下为什么结果会有所不同吗?

---我的另一个(最后一个)问题是关于我计算nivea提及总数的方式(所以nivea总是在评论中)。我尝试通过将所有注释(称为allwords)的字符串组合在一起然后执行此操作来完成此操作:

match="nivea"
niveacount1=0
for word in allwords:
    niveacount1+=1
print(niveacount1)

这是对的吗?或者我可以更好地做到这一点..

3 个答案:

答案 0 :(得分:3)

您可以使用list comprehensionin来测试子字符串。

nivea_comments = [c for c in comments if "nivea" in c]

如果您正在使用函数式编程,则会将其识别为filter

nivea_comments = filter(lambda c: "nivea" in c, comments)

答案 1 :(得分:0)

使用正则表达式和列表理解 例如:

import re
new_list = [x for x in comments if re.search('nivea', x)]

答案 2 :(得分:0)

首先尝试:

你的第一次尝试没有获得正确的金额,因为它正在寻找匹配中的单词。如果评论中有'i',那么'i'也会出现在nivea中。它确实如此,所以计数器将被提升为1.这就是为什么你没有得到正确数量的原因。

第二次尝试:

第二次尝试给出了不同的答案,因为您要求列表的长度为len(),而不是列表中所有值的总和。它也有与第一次尝试相同的问题,这就是为什么这个值仍然高于上次尝试的原因。

作为对上一个问题的回答,这不是一个很好的方法。因为如果它是一个字符串并且您使用for循环它将为每个字母而不是每个注释执行它。 例如:

s = "This is a check"
for word in s:
    print(word)

将返回:

T
h
i
s

因此最好使用前面提到的列表推导。