Есть ли способ улучшить производительность анализатора настроений nltk.sentiment.vader?

Мой текст взят из социальной сети, так что вы можете представить себе его природу, я думаю, что текст чистый и минимальный, насколько я мог представить; после выполнения следующей дезинфекции:

  • нет URL, нет имен пользователей
  • без знаков препинания, без ударений
  • нет номеров
  • нет стоп-слов (я думаю, что Вейдер делает это в любом случае)

Я думаю, что время выполнения является линейным, и я не собираюсь выполнять какое-либо распараллеливание из-за количества усилий, необходимых для изменения доступного кода. Например, для примерно 1000 текстов в диапазоне от ~50 КБ до ~150 КБ байтов требуется вокруг

и время работы составляет около 10 минут на моей машине.

Есть ли лучший способ подачи алгоритма, чтобы ускорить время приготовления? Код так же прост, как SentimentIntensityAnalyzer предназначен для работы, вот основная часть

sid = SentimentIntensityAnalyzer()

c.execute("select body, creation_date, group_id from posts where (substring(lower(body) from (%s))=(%s)) and language=\'en\' order by creation _ date DESC (s,s,)")
conn.commit()
if(c.rowcount>0):
                dump_fetched = c.fetchall()

textsSql=pd.DataFrame(dump_fetched,columns=['body','created_at', 'group_id'])
del dump_fetched
gc.collect()
texts = textsSql['body'].values
# here, some data manipulation: steps listed above
polarity_ = [sid.polarity_scores(s)['compound'] for s in texts]

1 ответ

Решение

/1. Вам не нужно удалять стоп-слова, nltk+vader уже делает это.

/ 2. Вам не нужно удалять пунктуацию, так как это также влияет на вычисления полярности Вейдера, помимо затрат на обработку. Итак, продолжайте пунктуацию.

    >>> txt = "this is superb!"
    >>> s.polarity_scores(txt)
    {'neg': 0.0, 'neu': 0.313, 'pos': 0.687, 'compound': 0.6588}
    >>> txt = "this is superb"
    >>> s.polarity_scores(txt)
    {'neg': 0.0, 'neu': 0.328, 'pos': 0.672, 'compound': 0.6249}

/3.Вы также должны ввести токенизацию предложений, поскольку это повысит точность, а затем вычислить среднюю полярность для абзаца на основе предложений. Пример здесь: https://github.com/cjhutto/vaderSentiment/blob/master/vaderSentiment/vaderSentiment.py

/4. Расчеты полярности полностью независимы друг от друга и могут использовать многопроцессорный пул для небольшого размера, скажем, 10, чтобы обеспечить хороший прирост скорости.

polarity_ = [sid.polarity_scores(s)['compound'] for s in texts]

Другие вопросы по тегам