使用Python和TextBlob设置情绪分析的n-grams

使用Python和TextBlob设置情绪分析的n-grams,python,sentiment-analysis,textblob,Python,Sentiment Analysis,Textblob,我想用Python和TextBloblib对一些句子进行情感分析。 我知道如何使用它,但有没有办法将n-grams设置为该值? 基本上,我不想逐字分析,但我想分析2个单词,3个单词,因为短语可以承载更多的意义和情感 例如,这就是我所做的(它是有效的): 但是我如何应用,例如n-grams=2,n-grams=3等等? 使用TextBlob或vadertouctionlib是否可以做到这一点?以下是一个不使用任何库而查找n-gram的解决方案 from textblob import TextBl

我想用
Python
TextBlob
lib对一些句子进行情感分析。 我知道如何使用它,但有没有办法将
n-grams
设置为该值?
基本上,我不想逐字分析,但我想分析2个单词,3个单词,因为短语可以承载更多的意义和情感

例如,这就是我所做的(它是有效的):

但是我如何应用,例如n-grams=2,n-grams=3等等?
使用
TextBlob
vadertouction
lib是否可以做到这一点?

以下是一个不使用任何库而查找n-gram的解决方案

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长度,请更改函数
find\ngrams()
中的
n

textblob中没有参数定义n-gram,而不是用作情绪分析功能的单词/单格

Textblob使用极性词汇来计算文本的总体情绪。该词典包含单格,这意味着它只能给你一个单词的情感,而不能给你一个n>1的n-gram

我想你可以通过向情感分类器中输入双元或三元语法来解决这个问题,就像输入一个句子,然后创建一个包含n元语法及其累积情感值的词典一样。 但我不确定这是个好主意。我假设您正在寻找Bigram来解决否定(“不错”)等问题,而词典方法将无法使用not来将情绪值翻转为bad

Textblob还包含使用naiveBayes分类器而不是词典方法的选项。这是在nltk提供的电影评论语料库上进行的培训,但培训的默认功能是单词/单字,就我看源代码所知。 您可能能够在其中实现自己的特征提取器,以提取n-gram而不是单词,然后相应地重新训练它并用于数据


尽管如此,我还是建议您使用Unigram和n>1-gram的组合作为特性,因为完全删除Unigram可能会对您的性能产生负面影响。Bigram的分布要稀疏得多,因此您在培训时会遇到数据稀疏问题。

您想设置什么
mystring.ngrams(n=3)
将为您提供3个语法基本上,我不想一个字一个字地分析情绪,但我想分析情绪2个字,3个字等等。您可以利用spacy的名词组块功能,与n-gram方法相比,它可以以更少的噪音形成更有价值的短语。您能告诉我如何做到这一点吗?或者更好,让我看看如何用n-gram和spacy来实现这一点。
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))