2016-04-29 8 views
-1

Я хочу сделать анализ настроений, но хочу использовать только элементы списка, содержащего определенное слово. Речь идет о комментариях, и я только хочу, чтобы проанализировать комментарии, которыеВыбор определенных элементов, содержащих определенное слово из списка в python

Например, мой список является:

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 комментариев

Вторая попытка: Вторая вещь, которую я попытался было сделать список, в котором каждый комментарий оценивается с общей когда упоминается нивеа. я получил список, как:

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

Затем я удалил все элементы, которые имели нулевое значение (потому что те комментарии, которые не о Nivea

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

Это привело 3771 комментариев ..

Последняя попытка: Моя последняя попытка была то, что вы, ребята ответили мне на мой первый вопрос, так как я использовал регулярное выражение и сделал:.

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

Это привело к 2583 комментариям.

Итак, что происходит прямо здесь? Может ли кто-нибудь объяснить мне, почему результаты все разные?

--- Еще один (последний) вопрос, который у меня есть, касается того, как я посчитал общее количество упоминаний о Нивее (так что сумма всех времен, когда была отмечена в комментариях). Я пытался сделать это, сделав строку всех комментариев (так называемые allwords) вместе, а затем сделал это:

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

Правильно ли это? Или я могу сделать это лучше.

ответ

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) 
0

Использование регулярных выражений и список понимание Например:

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

Большое вам спасибо! Я узнал о регулярных выражениях, но я попытался использовать параметр re.match или re.findall, но это не сработало. Это работает! Можете ли вы объяснить, что происходит, когда вы говорите: x для x в комментариях? Можно ли заменить x другим? –

+0

Да, вы можете, x для x принимает каждый элемент из комментариев с именем x и помещает его в список, если re.search находит шаблон. Это похоже на регулярный цикл с добавлением списка, но в одной строке. –

+0

Хорошо, спасибо! Теперь я немного смущен, потому что я попытался использовать разные способы, чтобы получить общее количество комментариев, в которых упоминается бренд. И все способы, которые я пытался, привели к различным ответам. Не могли бы вы объяснить, что происходит? Я напишу это в своем первом поле вопроса. –

0

Первая попытка:

Ваша первая попытка не получить нужное количество, потому что он ищет слово в матче. Если в комментариях будет «i», он будет выглядеть, если «i» также появится в nivea. Он делает, поэтому счетчик будет поднят с 1. Вот почему вы не получаете нужную сумму там.

Вторая попытка:

Вторая попытка дает другой ответ, потому что вы просите длины списка с LEN(), а не сумма всех значений в списке. Он также имеет ту же проблему, что и первая попытка, поэтому это значение все еще выше, чем в прошлой попытке.

И как ответ на ваш последний вопрос, это не очень хороший способ сделать это. Потому что, если это строка и вы используете цикл for, она будет делать это для каждой буквы, а не для каждого комментария. Например:

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

Вернется:

T 
h 
i 
s 

т.д.

Так что лучше использовать списковых, как упоминалось ранее.