信息抽取

🎥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

方法分类

  1. Bag-of-word features
    当前词(Colin), 前后词(professor, proposed), 前前(the), Bi-gram
  2. 词性
    当前词(名词), 前后词(名词, 动词), 前前(冠词)
  3. 前缀 & 后缀
    当前词(Co, in), 前后词(pr, or; pr, ed)
  4. 当前词的特性
    单词长度(5), 含有多少个大写字母, 是否大写开头, 是否包含-, 是否包含数字,
    是否包含to, my等
  5. steming+重复

3. 特征编码

位置locNLP 短语抽取 nlp 信息抽取_词性one-hot encoding, 会变成Tag Set的长度, 太长了

常见的特征种类

  • Categorical Feature: 男,女NLP 短语抽取 nlp 信息抽取_机器学习_02(0,1),(1,0)
  • 如果类别分类太多,比如城市,可以往上再合并一层,比如省
  • Contiguous Feature: 身高
  • 直接用, 或者映射到(0,1)
  • 离散化, <150$\toNLP 短语抽取 nlp 信息抽取_机器学习_03\toNLP 短语抽取 nlp 信息抽取_NLP 短语抽取_04\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 NLP 短语抽取 nlp 信息抽取_sed_05 规则2 NLP 短语抽取 nlp 信息抽取_机器学习_06, NLP 短语抽取 nlp 信息抽取_NLP 短语抽取_07是实体类型

NLP 短语抽取 nlp 信息抽取_词性_08
第一步: 生成模板

假设从文本中发现了4个模板,
NLP 短语抽取 nlp 信息抽取_NLP 短语抽取_09

NLP 短语抽取 nlp 信息抽取_NLP 短语抽取_10

NLP 短语抽取 nlp 信息抽取_机器学习_11

NLP 短语抽取 nlp 信息抽取_NLP 短语抽取_12

NLP 短语抽取 nlp 信息抽取_机器学习_13

在根据计算相似度的方法对模板进行聚类. 最最基本的聚类方法是, 假设有一个库NLP 短语抽取 nlp 信息抽取_NLP 短语抽取_14

  1. [NLP 短语抽取 nlp 信息抽取_NLP 短语抽取_15]
  2. [NLP 短语抽取 nlp 信息抽取_NLP 短语抽取_15,NLP 短语抽取 nlp 信息抽取_sed_17] when NLP 短语抽取 nlp 信息抽取_词性_18
  3. [NLP 短语抽取 nlp 信息抽取_NLP 短语抽取_15,NLP 短语抽取 nlp 信息抽取_sed_17], [NLP 短语抽取 nlp 信息抽取_NLP 短语抽取_21] when NLP 短语抽取 nlp 信息抽取_sed_22 and NLP 短语抽取 nlp 信息抽取_sed_23

设S是所有类, 目标是找到一个s, 使得max([[sim(NLP 短语抽取 nlp 信息抽取_机器学习_24,NLP 短语抽取 nlp 信息抽取_NLP 短语抽取_25) for NLP 短语抽取 nlp 信息抽取_NLP 短语抽取_25

然后对每类模板进行平均, 得到规则库

第二步: 生成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的置信度计算公式:

NLP 短语抽取 nlp 信息抽取_NLP 短语抽取_27

例如NLP 短语抽取 nlp 信息抽取_sed_28, NLP 短语抽取 nlp 信息抽取_NLP 短语抽取_29

Distant Supervison

无监督学习

实体问题

实体消岐

Entity Disambiguation 🎥212

基于上下文的消岐方法

苹果,ID,一种水果
苹果,ID,一个美国科技公司

句子

今天苹果发布了新的手机

通过tf-idf分别计算苹果在句子和实体库中的向量, 然后计算句子中的苹果和实体库中的相似度.

Almo Bert 都是这类算法

实体统一

一个实体有不同的名字

问题定义: 给定两个实体(str1,str2), 判断是否指向同一实体.

基于编辑距离的方法:

就跟拼写检查的方法类似

基于规则的方法

通过设计规则, 让字符串变成原型

百度有限公司, 百度科技有限公司 NLP 短语抽取 nlp 信息抽取_词性

在这个库里面的都可以删除?
有限公司  |  北京市  |  科技
无限公司  |  天津市  |
百度有限公司    -> 百度
百度科技有限公司 -> 百度
百度广州分公司   -> 百度
基于监督学习的方法
...百度...  =tf-idf=> v_1
...百度有限公司... =tf-idf=> v_2

文档中的两个实体经过tf-idf生成向量, 然后可以用多种方法

①concat[NLP 短语抽取 nlp 信息抽取_sed_31, NLP 短语抽取 nlp 信息抽取_sed_32]NLP 短语抽取 nlp 信息抽取_词性模型,进行二分类(是否是同一个实体)

②余弦相似度NLP 短语抽取 nlp 信息抽取_词性得到两个词语的相似度

基于图的实体统一

讲者画了一个图(网络), 节点是实体, 边是关系

实体A的特征NLP 短语抽取 nlp 信息抽取_机器学习_35表示为NLP 短语抽取 nlp 信息抽取_sed_36

然后用特征计算实体的相似度

指代消解

[张三]没有去上班, 因为生病了. 昨天[李四]陪[他](命名为A)去了医院, [他](命名为B)已经好了.
---
他是谁?
二分类问题

最简单的方法是看成二分类问题, 他指代的是不是张三?

(张三, A) -> 1
(李四, A) -> 0
(张三, B) -> 1
(李四, B) -> 0

每一对词都输入到二分类模型里面. 需要用之前学习的特征工程构建特征.