Проверьте, сколько слов из данного списка встречается в списке текста / строк - PullRequest
0 голосов
/ 24 марта 2020

У меня есть список текстовых данных, который содержит обзоры, что-то вроде этого:

1. 'I have bought several of the Vitality canned dog food products and have found them all to be of good quality. The product looks more like a stew than a processed meat and it smells better. My Labrador is finicky and she appreciates this product better than  most.'

2. 'Product arrived labeled as Jumbo Salted Peanuts...the peanuts were actually small sized unsalted. Not sure if this was an error or if the vendor intended to represent the product as "Jumbo".',

3. 'This is a confection that has been around a few centuries.  It is a light, pillowy citrus gelatin with nuts - in this case Filberts. And it is cut into tiny squares and then liberally coated with powdered sugar.  And it is a tiny mouthful of heaven.  Not too chewy, and very flavorful.  I highly recommend this yummy treat.  If you are familiar with the story of C.S. Lewis\' "The Lion, The Witch, and The Wardrobe" - this is the treat that seduces Edmund into selling out his Brother and Sisters to the Witch.

У меня есть отдельный список слов, которые я хочу знать, существует в этих обзорах:

['food','science','good','buy','feedback'....]

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

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

keywords = list(words)
text = list(df.summary.values)
sentences=[]
for element in text:
    if len(set(keywords)&set(element.split(' '))) >=3:
        sentences.append(element)

Ответы [ 2 ]

0 голосов
/ 24 марта 2020

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

Примерно так:

review_1 = "I have bought several of the Vitality canned dog food products and"
review_1 = set(review_1.split(" "))

Теперь набор review_1 содержит по одному слову. Затем возьмите свой список слов, преобразуйте его в набор и выполните пересечение.

words = ['food','science','good','buy','feedback'....]
words = set(['food','science','good','buy','feedback'....])

matches = review_1.intersection(words)

Результирующий набор, совпадает, содержит все общие слова. Длина этого - количество совпадений.

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

Если да, дайте мне знать через комментарий, и я могу написать несколько код для обновления ответа, чтобы включить этот сценарий.

РЕДАКТИРОВАТЬ: Обновление, чтобы включить вопрос комментария


Если вы хотите вести подсчет, сколько раз каждое слово повторяется, затем повесьте на обзорный список. Примените его только для установки при выполнении пересечения. Затем используйте метод списка «count», чтобы подсчитать, сколько раз каждое совпадение появляется в обзоре. В приведенном ниже примере я использую словарь для хранения результатов.

review_1 = "I have bought several of the Vitality canned dog food products and"

words = ['food','science','good','buy','feedback'....]
words = set(['food','science','good','buy','feedback'....])

matches = set(review_1).intersection(words)

match_counts = dict()
for match in matches:
    match_counts[match] = words.count(match)
0 голосов
/ 24 марта 2020

Вы можете использовать набор пересечений для поиска общих слов:

def filter_reviews(data, *, trigger_words = frozenset({'food', 'science', 'good', 'buy', 'feedback'})):
    for review in data:
        words = review.split()  # use whatever method is appropriate to get the words
        common = trigger_words.intersection(words)
        if len(common) >= 3:
            yield review, common
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...