【问题标题】:Setting n-grams for sentiment analysis with Python and TextBlob使用 Python 和 TextBlob 设置 n-gram 进行情感分析
【发布时间】:2020-03-26 05:49:20
【问题描述】:

我想用PythonTextBlob lib 对一些句子进行情感分析。 我知道如何使用它,但是有没有办法将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-grams = 2、n-grams = 3 等? 是否可以使用TextBlobVaderSentiment lib 来做到这一点?

【问题讨论】:

  • 你想设置什么? mystring.ngrams(n=3)会给你3克
  • 基本上,我不想逐字逐句分析情绪,但我想分析情绪 2 词、3 词等
  • 你可以利用 spacy 的名词分块功能,与 n-gram 方法相比,它可以形成更有价值的短语,并且噪音更少。
  • 你能告诉我怎么做吗?或者更好的是,向我展示如何使用 n-gram 和 spacy 来做到这一点。

标签: python sentiment-analysis textblob


【解决方案1】:

这是一个无需使用任何库即可找到 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 值。

【讨论】:

    【解决方案2】:

    textblob 中没有参数来定义 n-gram,而不是用作情感分析特征的单词/unigram。

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

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

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

    不管怎样,我建议您结合使用 unigrams 和 n>1-grams 作为特征,因为完全放弃 unigrams 可能会对您的性能产​​生负面影响。 Bigrams 的分布要稀疏得多,因此您在训练时会遇到数据稀疏问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-14
      • 2018-06-25
      • 1970-01-01
      • 2017-10-07
      • 1970-01-01
      • 2022-06-22
      相关资源
      最近更新 更多