Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中从列表中选择包含特定单词的特定元素_Python_List_Sentiment Analysis - Fatal编程技术网

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

在python中从列表中选择包含特定单词的特定元素,python,list,sentiment-analysis,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"] 我试着统计评论的总

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

例如,我的列表是:

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被提及的总数,而是评论的总数),其中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条评论的结果

第二次尝试: 我试着做的第二件事是列出一个列表,其中每一条评论的价值与nivea被提及的总次数相同。 我得到了一个类似于:

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)
这是正确的吗?或者我可以用更好的方法来做。

您可以在中使用和来测试子字符串的正确性

nivea_comments = [c for c in comments if "nivea" in c]
如果你对函数式编程感兴趣,你会认识到这是一个很好的例子


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

import re
new_list = [x for x in comments if re.search('nivea', x)]
s = "This is a check"
for word in s:
    print(word)

第一次尝试:

您的第一次尝试没有得到正确的金额,因为它正在查找匹配的单词。如果注释中有“i”,则会查看“i”是否也出现在nivea中。它确实出现了,因此计数器将以1提高。这就是您没有得到正确金额的原因

第二次尝试:

第二次尝试给出了不同的答案,因为您使用len()询问列表的长度,而不是列表中所有值的总和。它与第一次尝试存在相同的问题,因此该值仍然高于上次尝试的值

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

import re
new_list = [x for x in comments if re.search('nivea', x)]
s = "This is a check"
for word in s:
    print(word)
将返回:

T
h
i
s
等等


因此,最好使用前面提到的列表理解。

非常感谢!我学习了正则表达式,但我尝试使用re.match选项或re.findall,但不起作用。这很管用!你能解释一下当你在注释中说:x代表x时发生了什么吗?我可以用其他东西代替x吗?是的,你可以,x代表x Iit’如果re.search找到模式,它会从名为x的评论中提取每个元素,并将其放入列表中。这就像一个常规的for循环,带有append to list,但只在一行中。好的,谢谢!现在,我有点困惑,因为我以前尝试过不同的方法来获取提到品牌的评论总数。所有我尝试过的方法得到了不同的答案。你能解释一下发生了什么吗?我会在我的第一个问题框中写出来。如果在x中使用“nivea”,为什么不在注释中使用
[x代表x]
,正如本杰明·霍奇森所做的那样?在这种情况下,使用正则表达式比较容易,但由于我的工作领域,这是我想到的第一件事。但我同意@CodingLambdas的说法,在这里更容易。