Автоматически резюмируйте послание Трампа о положении страны

Рейтинг текста, Скрытый семантический анализ, 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 предложений для каждого метода:

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. Наслаждайтесь остатком недели!

Использованная литература: