Изучая анализ настроений Афинна, я наткнулся на сообщение Переполнение стека с таким простым запросом:
Я хочу понять код afinn
from afinn import Afinn
from nltk.corpus import gutenberg
import textwrap
afinn = Afinn()
sentences = (" ".join(wordlist) for wordlist in gutenberg.sents('austen-sense.txt'))
scored_sentences = ((afinn.score(sent), sent) for sent in sentences)
sorted_sentences = sorted(scored_sentences)
print("\n".join(textwrap.wrap(sorted_sentences[0][1], 70)))
Это код, включенный в документацию Afinn. Прежде чем мы разберемся, что здесь происходит, давайте сделаем шаг назад и посмотрим на цель Афинн и на то, почему я считаю этот блок текста забавным. Чтение статьи Финна Арупа Нильсена A new ANEW: Оценка списка слов для анализа настроений в микроблогах дает некоторую предысторию его создания. На момент создания ANEW Твиттера еще не было. Afinn - это обновленный список слов, который может анализировать язык, используемый в микроблогах.
Итак, давайте перейдем к коду.
В строке 5 gutenberg.sents('austen-sense.txt')
находится список списков, составленных из текста Разум и чувствительность. gutenberg.sents()
возвращает указанный файл (ы) в виде списка предложений или высказываний, каждое из которых закодировано как список цепочек слов. Например: gutenberg.sents('austen-sense.txt')[2]
, первое фактическое предложение в Sense and Sensibility, возвращает следующее:
['The', 'family', 'of', 'Dashwood', 'had', 'long', 'been', 'settled', 'in', 'Sussex', '.']
Afinn использует подход на основе списка слов для анализа тональности, поэтому вам нужен список слов, поэтому (" ".join(wordlist) for wordlist in gutenberg.sents('austen-sense.txt'))
используется для взятия каждого списка слов и воссоздания предложений. Вот почему перед пунктуацией есть пробелы. После соединения это становится:
['The family of Dashwood had long been settled in Sussex .']
Строка 6 создает список кортежей, где первый элемент каждого кортежа является оценкой тональности, заданной Афинном, а второй - предложением.
(afinn.score(sent))
дает оценку тональности словаря "отправлено". Оценка для словаря в приведенном вами примере составляет -18,0. Оценка для мирового списка, который я дал, - 0,0. Для каждого элемента списка в предложениях (отправленных) выводится оценка (afinn.score(sent))
и сопоставляется с предложением (отправлено).
Строка 7 сортирует список scored_sentences с сортировкой по первому элементу в каждом кортеже в порядке возрастания.
В операторе печати строки 8 используется перенос текста для отображения 70 символов в строке. Textwrap создаст список строк, поэтому соединение происходит с разрывом строки \ n. Оно показывает первое предложение в отсортированном списке, так что это предложение с наивысшей оценкой.
Без соединения textwrap.wrap(sorted_sentences[0][1], 70)
выглядит так:
['To attach myself to your sister , therefore , was not a thing to be',
'thought of ;-- and with a meanness , selfishness , cruelty -- which no',
'indignant , no contemptuous look , even of yours , Miss Dashwood , can',
'ever reprobate too much -- I was acting in this manner , trying to',
'engage her regard , without a thought of returning it .-- But one',
'thing may be said for me : even in that horrid state of selfish vanity',
', I did not know the extent of the injury I meditated , because I did',
'not THEN know what it was to love .']
Это не показано в коде, но у этого предложения есть оценка тональности 18. Это предложение с наивысшей оценкой во всей книге (все они отсортированы и оценены, это первое).
print("\n".join(textwrap.wrap(sorted_sentences[0][0], 70)))
Вернет «18», акцент в коде мой.
Настоящая загадка этого кода заключается в том, почему инструмент для анализа настроений для микроблогов использует текст из романа 1811 года в качестве примера того, как он работает?