增量训练实体识别分类器

时间:2011-11-04 15:50:53

标签: nlp machine-learning classification semantic-web

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

e.g。

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绝对相同。

e.g。

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

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

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

作为一个非常天真的第一次尝试,我正在考虑使用朴素贝叶斯分类器,将每个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),但增量培训支持可以更快地进行更新。

有哪些更好的方法?

2 个答案:

答案 0 :(得分:2)

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

您可能希望了解半监督群集。一个简短的谷歌搜索发现了论文Active Semi-Supervision for Pairwise Constrained Clustering,该论文为增量/主动的算法提供伪代码,并使用监督,因为它需要训练数据来指示哪些实体在同一群集中或不在同一群集中。您可以从您的sameas数据中轻松地推导出这一点,假设 - 例如 - uids 87w394234535k3l535肯定是截然不同的。

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

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

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

答案 1 :(得分:0)

您可能需要查看此方法:

  

“通过排名大规模在线学习图像相似性”Gal Chechik,Varun Sharma,Uri Shalit和Samy Bengio,机器学习研究期刊(2010)。   [PDF] [Project homepage]

更多想法:

'实体'是什么意思?实体是由'obj_called'引用的东西吗?您是否使用'obj_called'的内容来匹配不同的实体,例如'John'和'John Doe'相似?你是否使用句子之间的接近来表示类似的实体?映射的更大目标(任务)是什么?