Определить количество повторений слова в текстах и номера этих текстов

Имеется новый словарь вида:

texts2 = [{'id': 1, 'text': 'Шла Саша по шоссе'}, {'id': 2, 'text': 'Ехал Грека через реку'}, {'id': 3, 'text': 'Где труд там и счастье'}, {'id': 4, 'text': 'Доброта и труд рядом живут'}]

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

result = {"word": "труд", "count": 2, "id": [3, 4]}

Есть функция, которая может реализовать данный алгоритм. На вход она принимает словарь и какое-либо слово.

def number_of_occurrences(text, word):
        res = {"word": word, "count": 0, "id": []}
        for key, value in text.items():
            n = value.count(word)
            if n:
                res["count"] += n
                res["id"].append(key)
        return res

number_of_occurrences(texts, 'труд')

Но в данном случае в качестве словаря используются старые данные:

texts = {1 : 'Шла Саша по шоссе', 2 :'Ехал Грека через реку', 3 : 'Где труд там и счастье', 4 : 'Доброта и труд рядом живут'}

Помогите, пожалуйста, реализовать эту функцию,чтобы она работала правильно со словарем texts2.


Ответы (1 шт):

Автор решения: Zhihar

Я бы сделал так:

сначала собрал бы словарь, затем перевел бы в список

кроме того использовал бы set при сборе id вместо списка, чтобы не добавлять повторяющиеся id (например для случая текста вышли вышли мы на улицу вышли)

texts = [{'id': 1, 'text': 'Шла Саша по шоссе'}, {'id': 2, 'text': 'Ехал Грека через реку'}, {'id': 3, 'text': 'Где труд там и счастье'}, {'id': 4, 'text': 'Доброта и труд рядом живут'}]

tmp = dict()

for text in texts:
    for word in text['text'].split():
        tmp[word] = tmp.get(word, {'count': 0, 'id': set()})

        tmp[word]['count'] += 1
        tmp[word]['id'].add(text['id'])

res = [{'word': word, 'count': tmp[word]['count'], 'id': list([tmp[word]['id']])} for word in tmp]

print(res)

Конкретно для вашей задачи (с учетом того, что вы дополнили условие) ваша функция должна выглядеть так:

texts = [{'id': 1, 'text': 'Шла Саша по шоссе'}, {'id': 2, 'text': 'Ехал Грека через реку'}, {'id': 3, 'text': 'Где труд там и счастье'}, {'id': 4, 'text': 'Доброта и труд рядом живут'}]

def number_of_occurrences(word, texts):
    res = {"word": word, "count": 0, "id": []}
    for text in texts:
        n = text['text'].lower().count(word)
        if n:
            res["count"] += n
            if text['id'] not in res["id"]:
                res["id"].append(text['id'])

    return res

print(number_of_occurrences('шла', texts))

я специально перевел текст в нижний регистр, чтобы шла и Шла воспринимались как одно слово

→ Ссылка