Определить количество повторений слова в текстах и номера этих текстов
Имеется новый словарь вида:
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 шт):
Я бы сделал так:
сначала собрал бы словарь, затем перевел бы в список
кроме того использовал бы 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))
я специально перевел текст в нижний регистр, чтобы шла и Шла воспринимались как одно слово