6

我一直在从事与 Twitter 情绪分析相关的研究。我对如何在 Python 上编码有一点了解。由于我的研究与编码有关,因此我对如何使用 Python 分析情绪进行了一些研究,以下是我的研究成果: 1. 推文的标记化 2. 标记的 POS 标记,剩下的就是计算正数和否定我现在面临的问题并需要您的帮助的情绪。

下面是我的代码示例:

import nltk
sentence = "Iphone6 camera is awesome for low light "
token = nltk.word_tokenize(sentence)
tagged = nltk.pos_tag(token)

因此,我想问是否有人可以帮助我展示/指导使用 python 编写关于 sentiwordnet 的示例来计算已经被 POS 标记的推文的正负分。预先感谢

4

3 回答 3

24

你的问题到底是什么有点不清楚。您需要使用 Sentiwordnet 的指南吗?如果是这样,请查看此链接,

http://www.nltk.org/howto/sentiwordnet.html

由于您已经对单词进行了标记和 POS 标记,因此您现在需要做的就是使用此语法,

swn.senti_synset('breakdown.n.03')

打破争论,

  • 'breakdown' = 你需要分数的单词。
  • 'n' = 词性
  • '03' = 用法(01 表示最常见的用法,数字越大表示不太常见的用法)

因此,对于标记数组中的每个元组,如上创建一个字符串并将其传递给 senti_synset 函数以获得该单词的正面、负面和客观分数。

警告:POS 标记器为您提供的标记与 senti_synset 接受的标记不同。使用以下内容转换为同义词集表示法。

n - NOUN 
v - VERB 
a - ADJECTIVE 
s - ADJECTIVE SATELLITE 
r - ADVERB 

(以上符号使用 Sentiwordnet 3.0的功劳)

话虽如此,使用 Sentiwordnet 进行 Twitter 情绪分析通常不是一个好主意,原因如下:

推文中充满了 Sentiwordnet 经常无法识别的拼写错误和非字典词。为了解决这个问题,要么在发布标签之前对推文进行词形还原/词干化,要么使用机器学习分类器,例如 NLTK 内置函数的朴素贝叶斯。至于分类器的训练数据集,要么手动注释数据集,要么使用预先标记的集合,例如 Sentiment140 语料库。

如果您对实际执行情感分析不感兴趣,但需要给定推文的情感标签,您始终可以使用 Sentiment140 API 来实现此目的。

于 2016-07-08T09:40:21.053 回答
8

@Saravana Kumar 有一个绝妙的答案。

为了添加详细的代码,我正在写这个。我已经提到了链接https://nlpforhackers.io/sentiment-analysis-intro/

from nltk.corpus import wordnet as wn
from nltk.corpus import sentiwordnet as swn
from nltk.stem import PorterStemmer

def penn_to_wn(tag):
    """
    Convert between the PennTreebank tags to simple Wordnet tags
    """
    if tag.startswith('J'):
        return wn.ADJ
    elif tag.startswith('N'):
        return wn.NOUN
    elif tag.startswith('R'):
        return wn.ADV
    elif tag.startswith('V'):
        return wn.VERB
    return None

from nltk.stem import WordNetLemmatizer
lemmatizer = WordNetLemmatizer()

def get_sentiment(word,tag):
    """ returns list of pos neg and objective score. But returns empty list if not present in senti wordnet. """

    wn_tag = penn_to_wn(tag)
    if wn_tag not in (wn.NOUN, wn.ADJ, wn.ADV):
        return []

    lemma = lemmatizer.lemmatize(word, pos=wn_tag)
    if not lemma:
        return []

    synsets = wn.synsets(word, pos=wn_tag)
    if not synsets:
        return []

    # Take the first sense, the most common
    synset = synsets[0]
    swn_synset = swn.senti_synset(synset.name())

    return [swn_synset.pos_score(),swn_synset.neg_score(),swn_synset.obj_score()]


ps = PorterStemmer()
words_data = ['this','movie','is','wonderful']
# words_data = [ps.stem(x) for x in words_data] # if you want to further stem the word

pos_val = nltk.pos_tag(words_data)
senti_val = [get_sentiment(x,y) for (x,y) in pos_val]

print(f"pos_val is {pos_val}")
print(f"senti_val is {senti_val}")

输出

pos_val is [('this', 'DT'), ('movie', 'NN'), ('is', 'VBZ'), ('wonderful', 'JJ')]
senti_val is [[], [0.0, 0.0, 1.0], [], [0.75, 0.0, 0.25]]
于 2019-02-08T08:20:43.227 回答
-3

对于正面和负面情绪,首先您需要进行训练,并且必须训练模型。对于训练模型,您可以使用 SVM,您可以使用名为 LibSVM 的开放库。

于 2016-07-08T09:42:32.277 回答