Настройка n-грамм для анализа настроений с помощью Python и TextBlob

Я хочу провести анализ тональности некоторых предложений с Python и TextBlob библиотекой. Я знаю, как это использовать, но есть ли способ установить n-grams на это? В принципе, я не хочу анализировать слово за словом, а хочу анализировать 2 слова, 3 слова, потому что фразы могут нести гораздо больше смысла и настроения.

Например, вот что я сделал (это работает):

from textblob import TextBlob

my_string = "This product is very good, you should try it"

my_string = TextBlob(my_string)

sentiment = my_string.sentiment.polarity
subjectivity = my_string.sentiment.subjectivity

print(sentiment)
print(subjectivity)

Но как я могу применить, например, n-грамм = 2, n-грамм = 3 и т.д.? Возможно ли это сделать с помощью TextBlob или VaderSentiment lib?


person taga    schedule 01.12.2019    source источник
comment
что вы хотите установить? mystring.ngrams(n=3) даст вам 3 грамма   -  person jeremy_rutman    schedule 01.12.2019
comment
По сути, я не хочу анализировать тональность 1 слово за 1 словом, но я хочу анализировать тональность 2 слова, 3 слова и т. д.   -  person taga    schedule 01.12.2019
comment
вы можете использовать функцию разделения существительных в spacy, которая формирует более ценные фразы с меньшим количеством шума по сравнению с методом n-грамм.   -  person Haridas N    schedule 03.12.2019
comment
Можете ли вы показать мне, как это сделать? Или лучше показать мне, как это сделать с помощью n-грамм и пробелов.   -  person taga    schedule 03.12.2019


Ответы (2)


Вот решение, которое находит n-граммы без использования каких-либо библиотек.

from textblob import TextBlob

def find_ngrams(n, input_sequence):
    # Split sentence into tokens.
    tokens = input_sequence.split()
    ngrams = []
    for i in range(len(tokens) - n + 1):
        # Take n consecutive tokens in array.
        ngram = tokens[i:i+n]
        # Concatenate array items into string.
        ngram = ' '.join(ngram)
        ngrams.append(ngram)

    return ngrams

if __name__ == '__main__':
    my_string = "This product is very good, you should try it"

    ngrams = find_ngrams(3, my_string)
    analysis = {}
    for ngram in ngrams:
        blob = TextBlob(ngram)
        print('Ngram: {}'.format(ngram))
        print('Polarity: {}'.format(blob.sentiment.polarity))
        print('Subjectivity: {}'.format(blob.sentiment.subjectivity))

Чтобы изменить длину ngram, измените значение n в функции find_ngrams().

person Brent Rohner    schedule 05.12.2019

В текстовом блобе нет параметра для определения n-грамм, в отличие от слов/униграмм, которые будут использоваться в качестве функций для анализа тональности.

Textblob использует лексикон полярности для вычисления общей тональности текста. Этот лексикон содержит униграммы, что означает, что он может дать вам только тональность слова, но не n-грамму с n>1.

Я думаю, вы могли бы обойти это, вводя би- или триграммы в классификатор тональности, точно так же, как вы вводили бы предложение, а затем создавали словарь ваших n-грамм с их накопленным значением тональности. Но я не уверен, что это хорошая идея. Я предполагаю, что вы ищете биграммы для решения таких проблем, как отрицание ("неплохо"), и лексический подход не сможет использовать not для изменения настроения. значение для плохо.

Textblob также содержит возможность использовать классификатор naiveBayes вместо лексикона. Это обучено на корпусе обзоров фильмов, предоставленном nltk, но функции по умолчанию для обучения - это слова / униграммы, насколько я могу понять из исходного кода. Возможно, вы сможете реализовать свой собственный экстрактор функций внутри, чтобы извлекать n-граммы вместо слов, а затем соответствующим образом переобучить его и использовать для своих данных.

Несмотря на все это, я бы посоветовал вам использовать комбинацию униграмм и n>1-грамм в качестве функций, потому что полный отказ от униграмм может негативно повлиять на вашу производительность. Биграммы распределены гораздо реже, поэтому при обучении вы будете бороться с проблемами разреженности данных.

person Schnipp    schedule 08.12.2019