我想做一个情绪分析,但只想使用包含某个单词的列表元素。这是关于评论的,我只想分析那些
的评论例如,我的列表是:
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)
这是对的吗?或者我可以更好地做到这一点..
答案 0 :(得分:3)
您可以使用list comprehension和in
来测试子字符串。
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
等
因此最好使用前面提到的列表推导。