信息抽取
🎥188
非结构化数据; 抽取实体; 抽取关系;
评估方法: F1-Score
NER
方法分类
- 利用规则, 比如美国电话
(?:\(?[0-9]{3}\)?[0-9]{3}[ -.]?[0-9]{4})
- 投票模型, 统计每个单词的类型, 取频率最高的. 一般用作baseline
- 利用分类模型
1. 简单特征工程
def get_feature(word: str):
return np.array([word.istitle(), word.islower(), word.isupper(),
len(word), word.isdigit(), word.isalpha()])
words = [get_feature(w) for w in data["Word"].values.tolist()]
tags = data["Tag"].values.tolist()
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_predict
from sklearn.metrics import classification_report
pred = cross_val_predict(RandomForestClassifier(n_estimators=20), X=words, y=tags, cv=5)
report = classification_report(y_pred=pred, y_true=tags)
print(report)
使用基本的特征, 利用机器学习模型进行分类.
2. 文本领域的特征工程方法
以英文举例. The professor Colin proposed a model for NER in 1999
方法分类
- Bag-of-word features
当前词(Colin), 前后词(professor, proposed), 前前(the), Bi-gram - 词性
当前词(名词), 前后词(名词, 动词), 前前(冠词) - 前缀 & 后缀
当前词(Co, in), 前后词(pr, or; pr, ed) - 当前词的特性
单词长度(5), 含有多少个大写字母, 是否大写开头, 是否包含-
, 是否包含数字,
是否包含to, my等 - steming+重复
3. 特征编码
位置locone-hot encoding, 会变成Tag Set的长度, 太长了
常见的特征种类
- Categorical Feature: 男,女(0,1),(1,0)
- 如果类别分类太多,比如城市,可以往上再合并一层,比如省
- Contiguous Feature: 身高
- 直接用, 或者映射到(0,1)
- 离散化, <150$\to\to\to$3
- Ordinal Feature: 成绩(优秀,良好,中等,及格,不及格), 只有顺序, 不能对值的差距进行量化
关系抽取
🎥198
文本: 张三毕业于北京大学, 目前在北京工作
用三元组表示关系: (张三,工作在,北京)
, (张三,毕业于,北京大学)
, 图称为RDF
在工业界的知识图谱里面还会存一些属性, (property graph)
重要性
- 在问答系统中, 整理知识
- 扩充原有知识库
- 构建法律, 金融领域的知识库
Ontological Relation
- IS-A (Hypernym Relation)
- Instance-of
依靠这个可以搭建出层次关系
开源知识库代码(都是英文的)
- FreeBase
- WorldNet
- Yago
- Dpedia
- KnowledgeVault
方法
1. 基于规则(主流方法)
构建规则集
X (is a) Y
Y (such as) X
Y including X
Y, especially X
假如在文章里发现了
... apple (is a) fruit ...
... fruit (such as) banana
然后把(apple, fruit), (banana, fruit)放入知识库中
最终知识库中可能插入了错误的信息, 因为没有对规则定义一些约束.
对规则集增加实体限制
X is a Y ==> X[Fruit] is a Y
好处是: 提升挖掘结果的准确性, 只返回想要的结果
优点: (1)准确 (2)不需要训练数据
缺点: (1)低召回率(很难想出所有的规则) (2)浪费人力成本 (3)规则很难设计
2. 监督学习
步骤
①定义关系类型 ②定义实体类型 ③训练数据储备(标注好实体和关系)
特征工程
文本 American Airline(ORG), a unit of AMR, immediately match the move, spokesman Tim Wanger(PER) said
有一个分类算法,能够输出一对实体(比如 American Airline, Tim Wanger)属于不同关系的概率
这个算法需要的特征可以有:
①Bag-of-word feature, 除了一对实体本身之外, 还可以有单词的前后单词
②POS feature(词性特征), 实体本身的词性, 前后单词的词性
③实体类别: (ORG, PER, 等)
④Steming(针对英文)
⑤位置相关特征: (两个实体间出现了多少单词, 这句话在本文中的位置)
⑥句法分析相关特征: 两个节点在语(句)法树中的最短路径; 经过了几个节点
⑦依存文法相关特征: 最短路径; 是否直接相邻
分类算法
模型1: 输出是否有关系, 二分类问题, 大部分实体对都会被否决掉
模型2: 输出每个分类的概率,
3. 半监督 & 无监督学习
🎥205
Bootstrap算法
假设已知一些关系(称为seed tuple), 比如
作者,书
李航,统计机器学习
周,机器学习
第一步: 生成规则
假设在文本中发现了
李航写了统计机器学习
机器学习是由周写的
提取出规则
<作者>写了<书>
<书>是由<作者>写的
第二步: 生成关系tuple的过程
从数据集中扫描规则, 得到新的关系tuple
作者,书
张三,xxx
李四,yyy
将新的关系与上面的规则合并, 继续循环.
缺点
[1] 循环会导致错误累积, 到后面的准确率越来越低
[2] 规则要求精准匹配, 对句子轻微改动就会导致匹配不上
SnowBall(属于Bootstrap)
人为给定一些seed tuple, 比如
ORG,LOC
Microsoft,Redmond
IBM,Arkmonk
Boing,Seattle
Intel,Santa Clara
假设有以下文本
Computer serves at (Microsoft)'s headquaters in (Redmond).
In mid-afternoon, (Redmond)-based (Microsoft) fell.
The (Arkmonk)-based (IBM) introduted a new product.
(Boing)'s headquaters in (seattle)...
(Intel), (Santa Clara), cut price of...
把每个规则表示成五元组, 例如
(serves at) (Microsoft)('s headquaters in) (Redmond)( )
// 起个名字: <Left ORG Middle LOC Right>
// 设Left和Right的长度都是2
把Left Middle Right转成向量化的文字
计算相似度的方法
设有 规则1 规则2 , 是实体类型
第一步: 生成模板
假设从文本中发现了4个模板,
在根据计算相似度的方法对模板进行聚类. 最最基本的聚类方法是, 假设有一个库
- []
- [,] when
- [,], [] when and
设S是所有类, 目标是找到一个s, 使得max([[sim(,) for
然后对每类模板进行平均, 得到规则库
第二步: 生成tuple
(SnowBall方法是要先进行NER的)
找到一对实体的<Left,Middle,Right>, 然后计算跟规则库里面的每个规则的相似度, 如果超过阈值就放到"已知关系"中 (找到的实体是要符合规则定义的, 规则里面是定义了两个实体类型的)
第三步: 模式验证
将seed tuple作为ground truth (正确的), 验证每个规则找出来的tuple的正确率, 过滤掉准确率低的规则.
(准确率要保存起来, 下一步用)
第四步: tuple验证
一个tuple是通过多个规则加进来的
Pattern 1, 0.8
Pattern 2, 0.75
Pattern 3, 0.81
Pattern 4, 0.78
Pattern 5, 0.83
<Microsoft, Seattle>
<Amazon, Seattle>
<百度, 北京>
<Facebook, 北京>
有多个更靠谱的规则生成的关系tuple更靠谱. tuple的置信度计算公式:
例如,
Distant Supervison
无监督学习
实体问题
实体消岐
Entity Disambiguation 🎥212
基于上下文的消岐方法
苹果,ID,一种水果
苹果,ID,一个美国科技公司
句子
今天苹果发布了新的手机
通过tf-idf分别计算苹果在句子和实体库中的向量, 然后计算句子中的苹果和实体库中的相似度.
Almo Bert 都是这类算法
实体统一
一个实体有不同的名字
问题定义: 给定两个实体(str1,str2), 判断是否指向同一实体.
基于编辑距离的方法:
就跟拼写检查的方法类似
基于规则的方法
通过设计规则, 让字符串变成原型
百度有限公司, 百度科技有限公司
在这个库里面的都可以删除?
有限公司 | 北京市 | 科技
无限公司 | 天津市 |
百度有限公司 -> 百度
百度科技有限公司 -> 百度
百度广州分公司 -> 百度
基于监督学习的方法
...百度... =tf-idf=> v_1
...百度有限公司... =tf-idf=> v_2
文档中的两个实体经过tf-idf生成向量, 然后可以用多种方法
①concat[, ]模型,进行二分类(是否是同一个实体)
②余弦相似度得到两个词语的相似度
③基于图的实体统一
讲者画了一个图(网络), 节点是实体, 边是关系
实体A的特征表示为
然后用特征计算实体的相似度
指代消解
[张三]没有去上班, 因为生病了. 昨天[李四]陪[他](命名为A)去了医院, [他](命名为B)已经好了.
---
他是谁?
二分类问题
最简单的方法是看成二分类问题, 他指代的是不是张三?
(张三, A) -> 1
(李四, A) -> 0
(张三, B) -> 1
(李四, B) -> 0
每一对词都输入到二分类模型里面. 需要用之前学习的特征工程构建特征.