使用 Spacy 对句子进行情感评分

Emotional score of sentences using Spacy

我有一系列 100.000 多个句子,我想对它们的情感程度进行排名。

我对 NLP 世界还很陌生,但这就是我设法入门的方式(改编自 spacy 101

import spacy
from spacy.matcher import Matcher

matcher = Matcher(nlp.vocab)

def set_sentiment(matcher, doc, i, matches):
    doc.sentiment += 0.1

myemotionalwordlist = ['you','superb','great','free']

sentence0 = 'You are a superb great free person'
sentence1 = 'You are a great person'
sentence2 = 'Rocks are made o minerals'

sentences = [sentence0,sentence1,sentence2]

pattern2 = [[{"ORTH": emotionalword, "OP": "+"}] for emotionalword in myemotionalwordlist]
matcher.add("Emotional", set_sentiment, *pattern2)  # Match one or more emotional word

for sentence in sentences:
    doc = nlp(sentence)
    matches = matcher(doc)

    for match_id, start, end in matches:
        string_id = nlp.vocab.strings[match_id]
        span = doc[start:end]
    print("Sentiment", doc.sentiment)

myemotionalwordlist 是我手动构建的大约 200 个单词的列表。

我的问题是:

(1-a) 计算情感词的数量似乎不是最好的方法。有人有任何更好的建议吗?

(1-b) 如果这种方法足够好,关于如何从 wordnet 中提取情感词有什么建议吗?

(2) 升级此事件的最佳方式是什么?我正在考虑将所有句子添加到 pandas 数据框,然后将匹配函数应用于每个句子

提前致谢!

主要有两种方法:

  • 你已经开始的那个,这是一个情感词列表,并计算它们出现的频率
  • 向机器学习模型展示您认为情感句子和非情感句子的示例,并让它解决。

第一种方法会随着你给它更多的单词而变得更好,但你最终会达到一个极限。 (仅仅是由于人类语言的歧义性和灵活性,例如,虽然“你”比“它”更情绪化,但会有很多使用“你”的非情绪化句子。)

any suggestions on how I can extract emotional words from wordnet?

看看 sentiwordnet,它为每个 wordnet 条目添加了积极性、消极性或中立性的衡量标准。对于“情绪化”,您可以只提取那些得分超过 pos 或 neg 的内容,例如0.5。 (注意非商业许可。)

第二种方法可能会更好如果您可以为其提供足够的训练数据,但“足够”有时可能会太多。其他缺点是模型通常需要更多的计算能力和内存(如果您需要离线或在移动设备上工作,这是一个严重的问题),而且它们是一个黑盒子。

我认为 2020 年的方法是从预训练的 BERT 模型开始(越大越好,参见 the recent GPT-3 paper),然后用你的 100K 个句子样本对其进行微调已手动注释。在另一个样本上对其进行评估,并为错误的数据注释更多的训练数据。继续这样做,直到获得所需的准确度。

(顺便说一句,Spacy 支持这两种方法。我上面所说的微调也称为迁移学习。请参阅 https://spacy.io/usage/training#transfer-learning 另外,谷歌搜索“spacy 情感分析”会找到很多教程.)