2016-09-15 3 views
0

Имея длинный список комментариев (50, говоря), например, это:Список список слов на Python:

«это было самое большое разочарование нашей поездки ресторан был получил некоторые очень. хорошие отзывы, поэтому наши ожидания были высокими. Сервис был медленным, хотя ресторан был не очень полным. У меня был домашний салат, который мог бы выйти из любого сизмы в нас. keshi yena, хотя вкусно напомнил мне барбекю вытащил курицу, этот ресторан очень завышен ».

Я хочу создать список списка слов, сохраняющих токенирование предложения, используя python.

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

list(c("disappointment", "trip"), 
    c("restaurant", "received", "good", "reviews", "expectations", "high"), 
    c("service", "slow", "even", "though", "restaurant", "full"), 
    c("house", "salad", "come", "us"), 
    c("although", "tasty", "reminded", "pulled"), 
    "restaurant") 

Как я могу это сделать в python? Является ли R хорошим вариантом в этом случае? Я действительно буду благодарен за вашу помощь.

+2

Что такое 'c' во внутреннем списке? –

ответ

0

Если вы не хотите вручную создавать список слов остановки, я бы рекомендовал вам использовать библиотеку nltk в python. Он также обрабатывает расщепление предложения (в отличие от разбиения на каждый период).Образец, который разбирает ваше предложение может выглядеть следующим образом:

import nltk 
stop_words = set(nltk.corpus.stopwords.words('english')) 
text = "this was the biggest disappointment of our trip. the restaurant had received some very good reviews, so our expectations were high. the service was slow even though the restaurant was not very full. I had the house salad which could have come out of any sizzler in the us. the keshi yena, although tasty reminded me of barbequed pulled chicken. this restaurant is very overrated" 
sentence_detector = nltk.data.load('tokenizers/punkt/english.pickle') 
sentences = sentence_detector.tokenize(text.strip()) 
results = [] 
for sentence in sentences: 
    tokens = nltk.word_tokenize(sentence) 
    words = [t.lower() for t in tokens if t.isalnum()] 
    not_stop_words = tuple([w for w in words if w not in stop_words]) 
    results.append(not_stop_words) 
print results 

Однако, обратите внимание, что это не дает точно такой же вывод, как указано в вашем вопросе, но вместо этого выглядит следующим образом:

[('biggest', 'disappointment', 'trip'), ('restaurant', 'received', 'good', 'reviews', 'expectations', 'high'), ('service', 'slow', 'even', 'though', 'restaurant', 'full'), ('house', 'salad', 'could', 'come', 'sizzler', 'us'), ('keshi', 'yena', 'although', 'tasty', 'reminded', 'barbequed', 'pulled', 'chicken'), ('restaurant', 'overrated')] 

вы может потребоваться добавить несколько остановочных слов вручную в вашем случае, если вывод должен выглядеть одинаково.

+0

Привет. Что делать, если у меня есть отдельные строки текста, и я хочу сохранить разделение? А потом, как сохранить результат в файле csv? – mlosada

+0

Ну, не каждый кортеж в списке, соответствующем отдельному предложению в обзоре ресторана? Просто просмотрите список и получите безостановочные слова каждого предложения. Кроме того, чтобы сохранить содержимое в файл csv, я бы рекомендовал посмотреть на модуль csv в python, что может быть полезно, так как, вероятно, у вас могут быть запятые внутри каждого предложения. – CodeSurgeon

+0

Фактически, приведенный мною пример - это только обзор потребителей, в котором есть несколько предложений. Дело в том, что у меня около 50 комментариев с теми же функциями. – mlosada

0

Не уверен, что вы хотите R для этого или нет, но исходя из вашего требования, я думаю, что это можно сделать и в чистом питоническом ключе.

Вы в основном хотите список, содержащий небольшой список важных слов (которые не являются стоп-словами) на каждое предложение.

Таким образом, вы можете сделать что-то вроде

input_reviews = """ 
this was the biggest disappointment of our trip. the restaurant had received some very good reviews, so our expectations were high. 
the service was slow even though the restaurant was not very full. I had the house salad which could have come out of any sizzler in the us. 
the keshi yena, although tasty reminded me of barbequed pulled chicken. this restaurant is very overrated. 
""" 

# load your stop words list here 
stop_words_list = ['this', 'was', 'the', 'of', 'our', 'biggest', 'had', 'some', 'very', 'so', 'were', 'not'] 


def main(): 
    sentences = input_reviews.split('.') 
    sentence_list = [] 
    for sentence in sentences: 
     inner_list = [] 
     words_in_sentence = sentence.split(' ') 
     for word in words_in_sentence: 
      stripped_word = str(word).lstrip('\n') 
      if stripped_word and stripped_word not in stop_words_list: 
       # this is a good word 
       inner_list.append(stripped_word) 

     if inner_list: 
      sentence_list.append(inner_list) 

    print(sentence_list) 



if __name__ == '__main__': 
    main() 

С моей стороны, это выводит

[['disappointment', 'trip'], ['restaurant', 'received', 'good', 'reviews,', 'expectations', 'high'], ['service', 'slow', 'even', 'though', 'restaurant', 'full'], ['I', 'house', 'salad', 'which', 'could', 'have', 'come', 'out', 'any', 'sizzler', 'in', 'us'], ['keshi', 'yena,', 'although', 'tasty', 'reminded', 'me', 'barbequed', 'pulled', 'chicken'], ['restaurant', 'is', 'overrated']] 
+0

Hi Saif: Большое спасибо за вашу помощь. Теперь, как я могу сохранить эти результаты в матрице и в CSV-файле? – mlosada

+0

Это совершенно новое требование, и я предлагаю вам открыть новый вопрос для этого –

0

Это один из способов сделать это. Возможно, вам понадобится инициализировать stop_words в соответствии с вашими требованиями. Я предположил, что stop_words находится в нижнем регистре: следовательно, используя lower() на исходные предложения для сравнения. sentences.lower().split('.') дает предложения. s.split() дает список слов в каждом предложении.

stokens = [list(filter(lambda x: x not in stop_words, s.split())) for s in sentences.lower().split('.')] 

Вы можете задаться вопросом, почему мы используем filter и lambda. Альтернатива это, но это даст плоский список и, следовательно, не подходит:

stokens = [word for s in sentences.lower().split('.') for word in s.split() if word not in stop_words] 

filter является функциональной конструкцией программирования. Это помогает нам обрабатывать весь список, в данном случае, с помощью анонимной функции с использованием синтаксиса lambda.

Смежные вопросы