Изучая анализ настроений Афинна, я наткнулся на сообщение Переполнение стека с таким простым запросом:

Я хочу понять код 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 года в качестве примера того, как он работает?