Как выполнить анализ настроения разных тем / аспектов из одного и того же образца текста - PullRequest
0 голосов
/ 17 декабря 2018

Предположим, у меня есть следующий отзыв клиента, и я хочу узнать мнение об отеле и еде:

"Номер, который мы получили, был хорошим, но еда была средней"

Такесли бы это было в обзоре данных, результаты анализа выглядели бы так: Reviews Hotel Food The room was ... Pos Neg

Я наткнулся на несколько учебных пособий по Kaggle и Medium, которые обучают анализу настроений, но они всегда ищут общеенастроения.

Пожалуйста, помогите мне, если вы знаете способ, или знаете какие-либо учебники или знаете, какие термины Google, чтобы обойти эту проблему.Спасибо!

Редактировать: Пожалуйста, обратитесь к этим сторонам: http://sentic.net/sentire2011ott.pdf Они, похоже, лекционные заметки.Кто-нибудь знает реализацию того же Python?Спасибо!

Редактировать: Этот вопрос относится к ABSA (Аспектно-ориентированный анализ настроений)

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

Если предположить, что отзывы клиентов состоят из 1 к N предложений, часть из которых рассматривает несколько элементов (например, комната была отличной, но персонал был груб ), вы можете захотеть высказатьсяанализ отдельных сегментов текста (разделенных пунктуацией и конъюнкциями).

Это потребует сочетания методов предварительной обработки, которые будут разбивать рецензируемый текст на предложения, а также конъюнкции (, такие какно, и т. д. ).

Пример кода

Во-первых, токенизация предложения,

Предполагая, что текст обзора был « Хороший центральный отель.Номер был отличным, но персонал был грубым.Очень легко добраться с центральной станции

>>> from nltk.tokenize import sent_tokenize

>>> sentences = sent_tokenize(review_text)
>>> sentences
[“Nice central hotel.”,
 “Room was great but the staff were rude.”,
 “Very easy to reach from the central station.”]

Далее, разделив на несколько соединений,

import re

def split_conj(text):
    return map(str.strip, re.sub('(but|yet)', "|", text).split('|'))

segments = []
for sent in sentences:
    segments.extend(split_conj(sent))

Обратите внимание, что вам потребуется выполнить дополнительную предварительную обработку наsegments, который (на основе примера текста обзора) выглядит как

['Nice central hotel.',
 'Room was great',
 'the staff were rude.',
 'Very easy to reach from the central station.']

Затем создайте свой набор данных, связывающий идентификатор обзора с идентификаторами отдельных сегментов.Итак, ваши столбцы данных:

review ID | segment ID | segment text | label
# label could be a numerical value
# (range -1 to +1) instead of -1 and +1

Затем выполните анализ настроений для отдельных сегментов, а затем объедините их, чтобы получить общее настроение для каждого отзыва - на основе идентификатора обзора, связанного с каждым идентификатором сегмента.

Несколько вариантов для объединения баллов (неисчерпывающий список):

  • Простое добавление (в сценариях, где одинаковое количество положительных и отрицательных сегментов, это будетполучить нейтральную оценку)
  • простая взвешенная сумма (сумма оценки настроения сегмента X нормализованная длина сегмента)
  • взвешенная сумма на основе пользовательского присвоения важности сегментам (норма оценки настроения сегмента X нормализованнаяважность сегмента)
  • и т. д.

Надеюсь, это поможет вам.

0 голосов
/ 17 декабря 2018

Для этого примера, вы не можете просто разделить предложение в списке «объединяющих» слов, например «и, но, кроме того ...», а затем выполнить стандартный анализ для каждой части разделения?
Предполагая / проверяя, что они по-прежнему составляют полные предложения, поскольку, конечно, у вас могут быть и более сложные случаи, как в «И комната, и еда, которую мы получили, были хорошими», где вам нужно дублировать конечную часть предложения или получить часть"обе комнаты", которые больше не имеют смысла.
Но это предложение в любом случае имеет только один вид чувств ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...