nlp – 增量训练实体识别分类器

我正在做一些语义web / nlp研究,我有一组稀疏记录,包含数字和非数字数据的混合,表示标有从简单英语句子中提取的各种特征的实体.

例如

uid|features
87w39423|speaker=432, session=43242, sentence=34, obj_called=bob,favorite_color_is=blue
4535k3l535|speaker=512, session=2384, sentence=7, obj_called=tree,isa=plant,located_on=wilson_street
23432424|speaker=997, session=8945305, sentence=32, obj_called=salty,isa=cat,eats=mice
09834502|speaker=876, session=43242, sentence=56, obj_called=the monkey,ate=the banana
928374923|speaker=876, session=43242, sentence=57, obj_called=it,was=delicious
294234234|speaker=876, session=43243, sentence=58, obj_called=the monkey,ate=the banana
sd09f8098|speaker=876, session=43243, sentence=59, obj_called=it,was=hungry
...

单个实体可能出现不止一次(但每次都有不同的UID),并且可能与其他实例具有重叠的特征.第二个数据集表示上述哪个UID绝对相同.

例如

uid|sameas
87w39423|234k2j,234l24jlsd,dsdf9887s
4535k3l535|09d8fgdg0d9,l2jk34kl,sd9f08sf
23432424|io43po5,2l3jk42,sdf90s8df
09834502|294234234,sd09f8098
...

我将使用哪些算法来逐步训练可能采用一组特征的分类器,并立即推荐N个最相似的UID以及这些UID是否实际代表同一实体的概率?或者,我还希望获得缺少功能的建议,以便填充然后重新分类以获得更确定的匹配.

我研究了传统的近似最近邻算法.例如FLANNANN,我不认为这些是合适的,因为它们不可训练(在有监督的学习意义上),也不是通常设计用于稀疏的非数字输入.

作为一个非常天真的第一次尝试,我正在考虑使用朴素贝叶斯分类器,将每个SameAs关系转换为一组训练样本.因此,对于具有B sameas关系的每个实体A,我将迭代每个并训练分类器,如:

classifier = Classifier()
for entity,sameas_entities in sameas_dataset:
    entity_features = get_features(entity)
    for other_entity in sameas_entities:
        other_entity_features = get_features(other_entity)
        classifier.train(cls=entity, ['left_'+f for f in entity_features] + ['right_'+f for f in other_entity_features])
        classifier.train(cls=other_entity, ['left_'+f for f in other_entity_features] + ['right_'+f for f in entity_features])

然后使用它像:

>>> print classifier.findSameAs(dict(speaker=997, session=8945305, sentence=32, obj_called='salty',isa='cat',eats='mice'), n=7)
[(1.0, '23432424'),(0.999, 'io43po5', (1.0, '2l3jk42'), (1.0, 'sdf90s8df'), (0.76, 'jerwljk'), (0.34, 'rlekwj32424'), (0.08, '09843jlk')]
>>> print classifier.findSameAs(dict(isa='cat',eats='mice'), n=7)
[(0.09, '23432424'), (0.06, 'jerwljk'), (0.03, 'rlekwj32424'), (0.001, '09843jlk')]
>>> print classifier.findMissingFeatures(dict(isa='cat',eats='mice'), n=4)
['obj_called','has_fur','has_claws','lives_at_zoo']

这种方法有多可行?最初的批次培训将非常缓慢,至少为O(N ^ 2),但增量培训支持将允许更新更快地发生.

有什么更好的方法?

最佳答案 我认为这更像是一个聚类而不是一个分类问题.您的实体是数据点,而数据是实体到群集的映射.在这种情况下,集群是您的实体所指的不同“事物”.

您可能想看看半监督聚类.一个简短的谷歌搜索发现了论文Active Semi-Supervision for Pairwise Constrained Clustering,它提供了一种增量/主动算法的伪代码,并使用监督,因为它需要训练数据来指示哪些实体在同一群集中或不在同一群集中.你可以从你的sameas数据中轻松地得出这个,假设 – 例如 – uids 87w39423和4535k3l535绝对是不同的东西.

但是,为了使其工作,您需要根据数据中的功能提出距离度量.这里有很多选项,例如你可以在特征上使用简单的汉明距离,但这里的度量函数的选择有点随意.我不知道选择度量标准的任何好方法,但也许您在考虑最近邻居算法时已经考虑过这个.

您可以使用来自群集中心的距离度量来提出置信度分数.如果您想要实际的成员概率,那么您可能希望使用概率聚类模型,如高斯混合模型.有很多软件可以进行高斯混合建模,我不知道有任何半监督或增量.

如果您想要回答的问题是“给定一个实体,其他实体可能会引用相同的东西?”,那么可能还有其他合适的方法,但我不认为这就是您所追求的.

点赞