观点挖掘:抽取观点持有者、目标与表达

FreeGuideOnline 最新 2026-06-23

喜欢这款相机的用户 → 用户 [nsubj] I love this phone → I [nsubj]


可以设计规则:“如果存在情感词,且其主语是某人或某组织,则抽取为主观持有者”。工具如 spaCy 的依存解析可以快速实现:

```python
import spacy
nlp = spacy.load("en_core_web_sm")
doc = nlp("The battery life of this phone is excellent.")
# 查看情感词 "excellent" 的主语
for token in doc:
    if token.dep_ == "nsubj" and token.head.text == "excellent":
        print("持有者:", token.text)

2.2 基于序列标注的监督学习

将观点持有者抽取看作一个序列标注任务,使用 BIO 标签标注出持有者短语。常用模型:条件随机场(CRF)、BiLSTM-CRF、BERT 等。需要人工标注数据集,特征可包含词性、依存关系、位置等。

2.3 隐式持有者推断

很多句子没有显式持有者,例如“这辆车真费油!”。此时可基于语境推断,常见做法:

  • 使用作者作为默认持有者(适用于用户评论)。
  • 对引用内容进行源关联(如“张三说:‘这车不行’” → 持有者:张三)。

三、观点目标抽取

观点目标(亦称“方面词”)是观点所针对的实体或属性,如“相机的画质很清晰”中的“画质”。抽取任务常被称为方面词提取(Aspect Term Extraction)。

3.1 高频名词/名词短语

最简单的方法:从领域语料中统计高频名词,再经人工筛选。但噪声较高,会遗漏低频但重要的目标。

3.2 基于依存语法关系

情感词往往与其目标存在特定依存关系。例如,“画质清晰”中,“画质”是“清晰”的名词主语(nsubj);“价格合理”中,“价格”是“合理”的名词主语。可定义模板:

  • 情感词(形容词)← nsubj ← 目标(名词)
  • 目标(名词)→ amod → 情感词(形容词)

使用 spaCy 或 Stanza 提取此类配对,并聚类相似的目标词。

3.3 主题模型

LDA(Latent Dirichlet Allocation)可无监督发现文档中的潜在“主题”,每个主题下的高频词往往对应一个个方面。但主题模型不直接关联情感,需要后处理。

3.4 序列标注与深度学习

与持有者抽取类似,可使用 CRF 或 BERT 进行端到端序列标注。当前性能最好的方法大多基于预训练语言模型微调,如从句子“Battery life is great”中标注 “Battery” 和 “life” 为方面词(B-aspect, I-aspect)。

常用数据集:SemEval 的 Laptop 和 Restaurant 评论数据集,提供了方面词和情感极性的标注。

四、观点表达抽取

观点表达是文本中带有情感或主观性的词或短语,例如“惊艳的”、“垃圾”、“一般般”。它可能是形容词、动词、名词或组合。

4.1 词典法

利用已有的情感词典(如 HowNet、NTUSD、SentiWordNet)进行匹配。优点是快速,缺点是无法处理未登录词或上下文相关表达。

最小实现:

positive_words = ["good", "great", "excellent", "love"]
negative_words = ["bad", "terrible", "hate"]
def extract_expressions(text):
    words = text.lower().split()
    return [w for w in words if w in positive_words + negative_words]