Проверьте, сколько слов из данного списка встречается в списке текста / строк

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

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 ответа


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

Как это:

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)

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

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

Есть идеи?

10000