Определить номера текстов в которых встречается слово
Даны тексты:
text1 = "Шла Саша по шоссе"
text2 = "Ехал Грека через реку"
text3 = "Где труд там и счастье"
text4 = "Доброта и труд рядом живут"
text5 = "Без труда не выловишь и рыбку из пруда"
Необходимо создать список из словарей следующего вида:
result = [{"word": "труд", "count": 3, "id": [2, 3, 4]},
{"word": "доброта", "count": 1, "id": [3]},
.....
]
Подскажите, как посчитать количество повторений слова и в каких текстах оно используется, учитывая, что в конечном списке словарей слова должны быть в начальной форме (т.е. не "труда", а "труд").
Есть пример функции:
def f(texts, word):
res = {"word":word, "count":0, "id":[]}
for key, value in texts.items():
n = value.count(word)
if n:
res["count"] += n
res["id"].append(key)
return res
Но тут подсчет слов идет только слово в слово, то есть для слова "труд" будут созданы два словаря с двумя формами этого слова.
Ответы (1 шт):
Автор решения: Zhihar
→ Ссылка
такой вариант устроит (специально не стал сокращать):
texts = [
"Шла Саша по шоссе",
"Ехал Грека через реку",
"Где труд там и счастье",
"Доброта и труд рядом живут",
"Без труда не выловишь и рыбку из пруда",
]
tmp = dict()
for text in enumerate(texts):
for word in text[1].split():
if word not in tmp:
tmp[word] = {"word": word, "count": 1, "id": [text[0]]}
else:
tmp[word]["count"] += 1
tmp[word]["id"] += [text[0]]
res = []
for key in tmp:
tmp[key]["id"].sort()
res.append(tmp[key])
print(res)
можно чуть-чуть покороче
tmp = dict()
for text in enumerate(texts):
for word in text[1].split():
if word not in tmp:
tmp[word] = {"word": word, "count": 1, "id": [text[0]]}
else:
tmp[word]["count"] += 1
tmp[word]["id"] = sorted(tmp[word]["id"] + [text[0]])
res = list(tmp.values())
print(res)
Если нужна сортировка по кол-ву попаданий, то можно такой код использовать:
res = sorted(list(tmp.values()), key=lambda obj: -obj['count'])