基于上下文的sense2vec词向量技术解析

本文详细介绍了sense2vec词向量算法的升级版本,包括其在Reddit语料上的训练过程、与spaCy的集成方法、基于Prodigy的评估流程以及如何利用该技术快速构建命名实体识别模型,最终在2小时内达到82.1%的准确率。

sense2vec重装上阵:基于上下文的词向量

2019年11月22日|阅读时间18分钟

2016年基于Reddit 2015年度评论语料训练的sense2vec模型,如今迎来重大更新。本文呈现了新版本库、新向量资源、新评估方案,以及一个仅在几小时内就达到可用准确度的命名实体识别(NER)演示项目。

通过全新交互式演示,可以探索词语相似度并对比2015与2019年的差异。

算法核心创新

sense2vec(Trask等,2015)是对word2vec算法家族的革新,通过语言标注预处理文本,学习更精确的概念向量。词性标注特别有用:许多词语根据词性具有完全不同含义,因此需要分别查询"duck|VERB"和"duck|NOUN"的同义词。命名实体标注和名词短语也能帮助学习多词表达的向量。

本次升级包含三大突破:

  • 基于2019年Reddit评论训练的新向量模型,与2015版形成鲜明对比
  • 利用spaCy v2的管道组件和扩展属性系统彻底更新sense2vec库
  • 提供端到端的命名实体识别应用案例,展示技术实用价值

向量探索发现

对比2015与2019模型显示出有趣的语言演变:

  • 乡村歌手Billy Ray Cyrus因与年轻说唱歌手合作而改变语义关联
  • Harvey Weinstein的关联词从电影从业者变为性侵案相关名人
  • “AOC"从电子术语转变为美国议员姓名
  • “to flex"新增"炫耀"俚语含义
  • “to ghost”(已读不回)使用频率显著上升

技术实现细节

库功能架构

sense2vec作为Python包,支持基于词性标签和实体标签的词短语向量加载与查询。可作为独立库使用,或作为spaCy管道组件集成,提供便捷的自定义属性和方法。

独立使用示例

1
2
3
4
from sense2vec import Sense2Vec
s2v = Sense2Vec().from_disk("/path/to/s2v_reddit_2015_md")
query = "natural_language_processing|NOUN"
most_similar = s2v.most_similar(query, n=3)

spaCy组件集成

1
2
3
4
5
6
import spacy
from sense2vec import Sense2VecComponent

nlp = spacy.load("en_core_web_sm")
s2v = Sense2VecComponent(nlp.vocab).from_disk("/path/to/s2v_reddit_2015_md")
nlp.add_pipe(s2v)

评估方法论

提出三种评估工作流:

  1. 相似性三元评估:通过随机选择相同语义的短语进行对比
  2. 最相似评估:直接评估查询词与近邻词的关联质量
  3. A/B测试评估:对比两个向量模型的输出结果

A/B评估显示2019模型在33个案例中更优,2015模型在17个案例中更优,51个案例无显著差异。

NER模型快速构建

以时尚品牌识别为例,演示完整工作流程:

术语列表创建

使用sense2vec.teach配方快速构建品牌术语库:

1
prodigy sense2vec.teach s2v_fashion_brands ./s2v_reddit_md --seeds "adidas, Louis Vuitton, BOSS, New Balance"

规则基线建立

将术语列表转换为匹配模式:

1
{"label":"FASHION_BRAND","pattern":[{"lower":"ralph"},{"lower":"lauren"}]}

实体识别器集成

1
2
3
4
5
from spacy.pipeline import EntityRuler

nlp = spacy.blank("en")
ruler = EntityRuler(nlp).from_disk("./fashion_brands_patterns.jsonl")
nlp.add_pipe(ruler)

标注与训练成果

在2小时内完成:

  • 处理2,516条文本
  • 创建1,735条标注(1,235训练样本,500评估样本)
  • 最终模型达到82.1%准确率

性能对比数据

模型配置 准确率 F值 精确率 召回率
规则基线 48.4% 96.3 32.4 -
spaCy空白模型 65.7% 77.3 57.1 -
spaCy+词向量 73.4% 81.5 66.8 -
spaCy+词向量+tok2vec 82.1% 83.5 80.7 -

预训练技术创新

采用掩码语言模型目标,预测词语的GloVe向量而非单词ID,使用余弦损失函数。在10亿词规模的Reddit评论上训练8小时,模型大小仅17.8MB。

训练命令:

1
2
3
spacy pretrain /path/to/data.jsonl en_vectors_web_lg /path/to/output
--batch-size 3000 --max-length 256 --depth 8 --embed-rows 10000
--width 128 --use-vectors -gpu 0

未来发展方向

支持更精确的非组合性名词短语检测,处理其他多词表达(特别是动词短语),增加词形归一化预处理,扩展至英语之外的其他语言。


comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计