Python Text Summarizer - поддерживать порядок предложений - PullRequest
0 голосов
/ 06 марта 2019

Я учу себя 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 заявлений о предполагаемом проступке банков, финансовых консультантов, пенсионных фондов и страховых компаний. "

В качестве примера желаемого результата: третье предложение выше: «Королевская комиссия в этом году, самая высокая форма общественного расследования в стране, выявила широко распространенные правонарушения в отрасли». на самом деле предшествует «расследованию в австралийском банке: им было все равно, кого они обидят» в оригинальной статье, и я хотел бы, чтобы результаты сохранили этот порядок предложений.

1 Ответ

0 голосов
/ 08 марта 2019

Получил это, оставив здесь на случай, если другие будут любопытны:

#iterate through each sentence and combine the weighted score of the underlying word
sentence_scores = {}
cnt = 0
for sent in sentence_list:
    sentence_scores[sent] = []
    score = 0
    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():
                    score = word_frequencies[word]
                else:
                    score += word_frequencies[word]
    sentence_scores[sent].append(score)
    sentence_scores[sent].append(cnt)
    cnt = cnt + 1


#Sort the dictionary using the score in descending order and then index in ascending order
#Getting the top 7 sentences
#Putting them in 1 string variable
from operator import itemgetter
top7 = dict(sorted(sentence_scores.items(), key=itemgetter(1), reverse = True)[0:7])
#print(top7)
def Sort(sub_li):
    return(sorted(sub_li, key = lambda sub_li: sub_li[1])) 
sentence_summary = Sort(top7.values())
summary = ""
for value in sentence_summary:
    for key in top7:
        if top7[key] == value:
            summary = summary + key
print(summary)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...