Я учу себя Python и закончил элементарный текстовый суммирующий. Я почти доволен кратким текстом, но хочу еще немного отполировать конечный продукт.
Код правильно выполняет некоторую стандартную обработку текста (токенизация, удаление стоп-слов и т. Д.). Затем код оценивает каждое предложение на основе взвешенной частоты слова. Я использую метод heapq.nlargest (), чтобы вернуть 7 лучших предложений, которые, как мне кажется, хорошо работают на основе моего образца текста.
Проблема, с которой я сталкиваюсь, состоит в том, что лучшие 7 предложений возвращаются отсортированными по наивысшему баллу -> наименьшему баллу. Я понимаю , почему это происходит. Я бы предпочел сохранить тот же порядок предложений, что и в оригинальном тексте. Я включил соответствующие фрагменты кода и надеюсь, что кто-нибудь поможет мне найти решение.
#remove all stopwords from text, build clean list of lower case words
clean_data = []
for word in tokens:
if str(word).lower() not in stoplist:
clean_data.append(word.lower())
#build dictionary of all words with frequency counts: {key:value = word:count}
word_frequencies = {}
for word in clean_data:
if word not in word_frequencies.keys():
word_frequencies[word] = 1
else:
word_frequencies[word] += 1
#print(word_frequencies.items())
#update the dictionary with a weighted frequency
maximum_frequency = max(word_frequencies.values())
#print(maximum_frequency)
for word in word_frequencies.keys():
word_frequencies[word] = (word_frequencies[word]/maximum_frequency)
#print(word_frequencies.items())
#iterate through each sentence and combine the weighted score of the underlying word
sentence_scores = {}
for sent in sentence_list:
for word in nltk.word_tokenize(sent.lower()):
if word in word_frequencies.keys():
if len(sent.split(' ')) < 30:
if sent not in sentence_scores.keys():
sentence_scores[sent] = word_frequencies[word]
else:
sentence_scores[sent] += word_frequencies[word]
#print(sentence_scores.items())
summary_sentences = heapq.nlargest(7, sentence_scores, key = sentence_scores.get)
summary = ' '.join(summary_sentences)
print(summary)
Я тестирую по следующей статье: https://www.bbc.com/news/world-australia-45674716
Текущий результат: «Австралийский банковский запрос:« Им было все равно, кого они обидели »
В ходе расследования также были заслушаны показания о корпоративном мошенничестве, взяточничестве в банках, действиях по обману регуляторов и безрассудной практике. В этом году королевская комиссия, самая высокая форма общественного расследования, выявила широко распространенные правонарушения в отрасли. Королевская комиссия появилась после десятилетия скандального поведения в финансовом секторе Австралии, крупнейшей отрасли страны. «[Отчет] очень ярко освещает плохое поведение нашего финансового сектора», - сказал казначей Джош Фриденберг. «Когда было обнаружено нарушение, оно либо оставалось безнаказанным, либо последствия не соответствовали серьезности того, что было сделано», - сказал он. Клиенты банка, которые потеряли все
Он также подверг критике то, что он назвал неадекватными действиями регуляторов для банков и финансовых фирм. Он также получил более 9300 заявлений о предполагаемом проступке банков, финансовых консультантов, пенсионных фондов и страховых компаний. "
В качестве примера желаемого результата: третье предложение выше: «Королевская комиссия в этом году, самая высокая форма общественного расследования в стране, выявила широко распространенные правонарушения в отрасли». на самом деле предшествует «расследованию в австралийском банке: им было все равно, кого они обидят» в оригинальной статье, и я хотел бы, чтобы результаты сохранили этот порядок предложений.