可增量训练的实体识别分类器

Posted

技术标签:

【中文标题】可增量训练的实体识别分类器【英文标题】:Incrementally Trainable Entity Recognition Classifier 【发布时间】:2011-12-22 03:49:36 【问题描述】:

我正在做一些语义网络/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 是否实际代表相同实体?或者,我还想获得缺失特征的建议以进行填充,然后重新分类以获得更确定的匹配。

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

作为一个非常天真的第一次尝试,我正在考虑使用一个天真的贝叶斯分类器,将每个 SameAs 关系转换为一组训练样本。因此,对于每个具有 B 相同关系的实体 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),但增量训练支持可以让更新更快地发生。

什么是更好的方法?

【问题讨论】:

有趣的问题,一如既往的 Cerin。当你说你想要增量训练时,这是否意味着你获得更多的实体数据、更多的“相同”数据或两者兼而有之? 【参考方案1】:

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

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

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

您可以使用距集群中心的距离度量来得出置信度分数。如果你想要一个实际的成员概率,那么你会想要使用概率聚类模型,比如高斯混合模型。有很多软件可以做高斯混合建模,我不知道有什么是半监督或增量的。

如果您想回答的问题类似于“给定一个实体,哪些其他实体可能指代同一事物?”,可能还有其他合适的方法,但我认为这不是您所追求的.

【讨论】:

这是一个有趣的想法。但是,我仍然认为这是一个分类而不是聚类问题的原因是,聚类通常试图将一个向量拟合到一个 single 聚类中,而没有任何置信度得分。我想您可以使用距离度量来衡量向量与每个集群的距离,但我不确定这将如何转化为概率。 @Cerin 那么,问题是您想要某种成员的置信度得分,您想要一个实际的成员概率,还是您希望实体拥有多个集群的成员? @Cerin 如,一个给定的实体可以真正属于多个“事物”(就基本事实而言) 好问题。我想得越多,似乎监督聚类 == 分类就越多。我想我正在寻找一个属于多个组/事物的实体。例如,“我的苹果”可能属于代表属于我的特定苹果的一个“事物”,但它也可能属于另一个代表“水果”的“事物”,以及代表上位词/全名的其他组。 我认为有监督的聚类很像一种生成分类算法(例如朴素贝叶斯),而不是像逻辑回归这样的判别算法。然而,上述算法是半监督的,因此它确实在未标记的示例上训练其模型。【参考方案2】:

你可能想看看这个方法:

“通过排名进行图像相似度的大规模在线学习”Gal Chechik、Varun Sharma、Uri Shalit 和 Samy Bengio,机器学习研究杂志(2010 年)。 [PDF] [Project homepage]

更多想法:

“实体”是什么意思?实体是“obj_call”所指的东西吗?您是否使用“obj_call”的内容来匹配不同的实体,例如“约翰”与“约翰·多伊”相似吗?您是否使用句子之间的接近度来表示相似的实体?映射的更大目标(任务)是什么?

【讨论】:

就我而言,“实体”不是一段文本。它更像是一个“虚拟”对象,类似于聚类算法中组的概念。更大的目标是通过将引用同一实体的单独句子中定义的属性链接在一起,更好地从自然语言构建模型。即我只是想更好地理解“实体识别”这个主题。

以上是关于可增量训练的实体识别分类器的主要内容,如果未能解决你的问题,请参考以下文章

如何使用opencv 训练分类器以及训练过程中的问题

关于级联分类器训练过程中遇到的问题

opencv训练好的分类器都有哪些

图像识别之初探SVM分类器

opencv训练自己的模型,实现特定物体的识别

如何利用opencv进行样本训练