【问题标题】:sentiwordnet scoring with pythonsentiwordnet 使用 python 评分
【发布时间】:2016-07-08 09:16:53
【问题描述】:

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

下面是我的代码示例:

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

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

【问题讨论】:

标签: python nltk senti-wordnet


【解决方案1】:

您的问题到底是什么有点不清楚。您需要使用 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 

(感谢Using Sentiwordnet 3.0 上述符号)

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

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

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

【讨论】:

  • 有关为此目的使用分类器和 Sentiment140 数据集的一些好的教程,请查看此链接,link 对于词干提取和词形还原,请查看此链接:stackoverflow.com/questions/771918/…
  • 首先,非常感谢您的详细回答,Saravana。我非常了解您在那里写的内容,但我通常不太了解编写代码,因此我想请您帮个忙,如果可能的话,您可以帮我编写代码并在完成后运行该过程POS 标记。这对我的研究取得进一步的进展将是非常有启发性的。 import nltk sentence = "Iphone6 camera is awesome for low light " token = nltk.word_tokenize(sentence) tagged = nltk.pos_tag(token)
【解决方案2】:

@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]]

【讨论】:

  • 如果它使用csv中的大数据那么我只需要将csv读入words_data?
  • 嗨,好问题。如果你有很好的计算能力,那么直接使用是可以的。如果您遇到任何问题,我建议您使用支持大数据的语言,例如 python on spark (pyspark) / scala 等
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2016-03-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-30
    • 2013-03-17
    • 1970-01-01
    • 2011-03-03
    • 2013-09-02
    • 1970-01-01
    相关资源
    最近更新 更多