Автоматически резюмируйте послание Трампа о положении страны
Рейтинг текста, Скрытый семантический анализ, Gensim, Sumy, NLTK
Автоматическое резюмирование текста - это процесс создания короткой, сжатой и последовательной версии более длинного документа. Это одна из самых интересных и сложных задач в области НЛП.
С тех пор, как Трамп вчера вечером выступил со своим Обращением о состоянии Союза, Основные выводы, Проверка фактов, Анализ, Реакции стали повсюду. СМИ. Если вы похожи на меня, не хотите слушать всю речь в течение 82 минут или читать весь адрес, и вы не хотите пропустить ничего важного, то мы постараемся исследовать области резюмирования текста и построения текстовый сумматор. Будем надеяться, что резюме, которое мы получаем из нашего текстового составителя, будет максимально приближено к исходной речи, но намного короче. Давайте начнем!
TextRank с NLTK
TextRank - это метод неконтролируемого реферирования текста, который использует интуицию алгоритма PageRank для ранжирования предложений. При использовании NLTK для нашего проекта у нас есть следующие шаги:
- Получите адрес государства в Интернете.
- Базовая чистка текста.
- Найдите векторное представление (вложения слов) для каждого предложения.
- Затем вычисляются сходства между векторами предложений и сохраняются в матрице.
- Матрица подобия преобразуется в граф с предложениями как вершинами и оценками сходства как ребрами.
- Примените алгоритм PageRank к этому графу предложений для вычисления ранга предложения.
- Распечатайте несколько предложений с самым высоким рейтингом.
Данные
Эти данные можно найти на сайте Белого дома, они были опубликованы сегодня.
def get_only_text(url): """ return the title and the text of the article at the specified url """ page = urlopen(url) soup = BeautifulSoup(page, "lxml") text = ' '.join(map(lambda p: p.text, soup.find_all('p'))) print ("=====================") print (text) print ("=====================") return soup.title.text, text url="https://www.whitehouse.gov/briefings-statements/remarks-president-trump-state-union-address-2/" text = get_only_text(url)
Сначала мы взглянем на несколько предложений:
sentences = [] for s in text: sentences.append(sent_tokenize(s)) sentences = [y for x in sentences for y in x] sentences[30:40]
Звучит примерно правильно.
Мы будем использовать предварительно обученные векторы слов для создания векторов предложений в адресе состояния Союза. Я скачал данные из Перчатки и сохранил в своем рабочем каталоге.
word_embeddings = {} f = open('glove.6B.100d.txt', encoding='utf-8') for line in f: values = line.split() word = values[0] coefs = np.asarray(values[1:], dtype='float32') word_embeddings[word] = coefs f.close()
Некоторая базовая предварительная обработка текста, такая как удаление стоп-слов и удаление специальных символов.
clean_sentences = pd.Series(sentences).str.replace("[^a-zA-Z]", " ") clean_sentences = [s.lower() for s in clean_sentences] stop_words = stopwords.words('english') def remove_stopwords(sen): sen_new = " ".join([i for i in sen if i not in stop_words]) return sen_new clean_sentences = [remove_stopwords(r.split()) for r in clean_sentences]
В следующих сценариях кода мы создаем векторы для предложений. Сначала мы выбираем векторы (каждый размером 100 элементов) для составных слов в предложении, а затем берем среднее значение этих векторов, чтобы получить консолидированный вектор для предложения. И мы создаем пустую матрицу подобия и заполняем ее косинусоидальным подобием предложений. Наконец, мы инициализируем матрицу с оценками косинусного сходства и распечатываем 15 лучших предложений в качестве итогового представления.
Сумский модуль Python
Sumy - это библиотека Python для извлечения резюме из HTML-страниц или простого текста. Его разработала компания Мисо-Белица. Мы применим следующие методы резюмирования к адресу состояния Союза и распечатаем по 10 предложений для каждого метода:
- LsaSummarizer. Скрытый семантический анализ, который сочетает частоту терминов с разложением по сингулярным числам.
LANGUAGE = "english" SENTENCES_COUNT = 10 url="https://www.whitehouse.gov/briefings-statements/remarks-president-trump-state-union-address-2/" parser = HtmlParser.from_url(url, Tokenizer(LANGUAGE)) print ("--LsaSummarizer--") summarizer = LsaSummarizer() summarizer = LsaSummarizer(Stemmer(LANGUAGE)) summarizer.stop_words = get_stop_words(LANGUAGE) for sentence in summarizer(parser.document, SENTENCES_COUNT): print(sentence)
- LuhnSummarizer. Наивный подход, основанный на TF-IDF и смотрящий на «размер окна» неважных слов между важными словами. Он также присваивает более высокий вес предложениям, встречающимся в начале документа.
print ("--LuhnSummarizer--") summarizer = LuhnSummarizer() summarizer = LuhnSummarizer(Stemmer(LANGUAGE)) summarizer.stop_words = ("I", "am", "the", "you", "are", "me", "is", "than", "that", "this") for sentence in summarizer(parser.document, SENTENCES_COUNT): print(sentence)
- LexRankSummarizer. Неконтролируемый подход, вдохновленный алгоритмами PageRank. Он определяет относительную важность всех слов в документе и выбирает предложения, содержащие наибольшее количество этих высоко оцененных слов.
print ("--LexRankSummarizer--") summarizer = LexRankSummarizer() summarizer = LexRankSummarizer(Stemmer(LANGUAGE)) summarizer.stop_words = ("I", "am", "the", "you", "are", "me", "is", "than", "that", "this") for sentence in summarizer(parser.document, SENTENCES_COUNT): print(sentence)
- EdmundsonSummarizer. При использовании EdmundsonSummarizer нам нужно ввести бонусные_слова, которые мы хотим видеть в сводке и которые являются значимыми, stigma_words, которые не важны, null_words, которые являются стоп-словами.
print ("--EdmundsonSummarizer--") summarizer = EdmundsonSummarizer() words1 = ("economy", "fight", "trade", "china") summarizer.bonus_words = words1 words2 = ("another", "and", "some", "next") summarizer.stigma_words = words2 words3 = ("another", "and", "some", "next") summarizer.null_words = words3 for sentence in summarizer(parser.document, SENTENCES_COUNT): print(sentence)
Это результат EdmundsonSummarizer после того, как я установил критерии вышеупомянутых слов:
Кажется, есть много параметров, которые нужно настроить, прежде чем мы определим, какой метод / методы лучше всего подходят для резюмирования послания Трампа о состоянии Союза. В любом случае, мне лично понравилось это познавательное путешествие. Надеюсь ты тоже.
Блокнот Jupyter можно найти на Github. Наслаждайтесь остатком недели!
Использованная литература: