使用 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 情感分析”会找到很多教程.)
我有一系列 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 情感分析”会找到很多教程.)