1.建立新的结构化的知识库
2.扩大现有知识库
3.支持QA系统
关系分类:一般是判断一个句子中两个实体(entity)是哪种关系,属于多分类问题。
关系抽取:从一个句子中判断两个entity是否有关系,一般是一个二分类问题,指定某种关系。
1.手写规则
2.监督学习
3.半监督/无监督学习
优点:有高准确率、可以为特定领域定制
缺点:低召回率、要考虑周全所有可能的模式(pattern)很难,也很费时间精力需要为每条关系来定意思pattern
选择我们想提取的关系集合
选择相关的命名体集合
寻找并标注数据 选择有代表性的语料库 标记命名实体 人工标注实体间的关系 分成训练、开发、测试集
训练分类器:MaxEnt、Naive、Bayes、SVM
利用少量的标注信息进行学习,就bootstrap的方法利用少量的实例作为初始种子(seed tuples)的集合,然后利用pattern学习方法进行学习,通过不断的迭代,从非结构化数据中抽取实例,然后从新学到的实例中学习新的pattern 并扩充pattern集合。
深度学习用到的特征通常有:
Word embeddings
Position embeddings
Knowledge embeddings
模型通常有:CNN/RNN+Attention
import tensorflow as tf
sess = tf.InteractiveSession()
# 定义一个常量 4行3列
mask_embedding = tf.constant([[0,0,0],[1,0,0],[0,1,0],[0,0,1]])
# 11是第一段 222是第二段 3333是第三段 后面补一个0
input_mask = tf.constant([[1],[1],[2],[2],[2],[3],[3],[3],[3],[0]])
print(input_mask.eval())
print(input_mask.eval().shape)
mask = tf.nn.embedding_lookup(mask_embedding,input_mask)
print(mask.eval(),mask.eval().shape)
# mask *100 在第二个位置上增加一个维度
a = tf.expand_dims(mask * 100,2)
print(a.eval(),a.eval().shape)
# 将卷积层的feature map取出
x = tf.constant([[[1,0],[2,1]],[[2,1],[3,2]],
[[3,2],[4,3]],[[4,3],[5,4]],[[5,4],[6,5]],[[6,5],[7,6]],[[7,6],[8,7]],[[8,7],[9,8]],[[9,8],[0,0]],[[0,0],[0,0]]])
print(x.eval())
print(x.eval().shape)
# 在最后一维扩展一个维度
b = tf.expand_dims(x,-1)
print(b.eval())
print(b.eval().shape)
# a:(10,1,1,3)
# b:(10,2,2,1)
# 利用广播机制 维度小的会复制成维度大的部分
c = a+b
print(c.eval())
print(c.eval().shape)
print(c.eval()[0])
print("----------")
print(c.eval()[2])
d = tf.reduce_max(c,axis=1)
print(d.eval())
print(d.eval().shape)
# 还原回去
e = d-100
print(e.eval())
feature_dim = x.shape[-1]
print(feature_dim)
f = tf.reshape(e,[-1,feature_dim*3])
f.eval()
# 对f进行非线性激活 小于0的时候是0 大于0的时候是线性的
h = tf.nn.relu(f)
# 分段maxpooling的结果
h.eval()
i = tf.reduce_max(x,axis=-2)
i.eval()
sess.close()