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

Nlp 增量可训练实体识别分类器,nlp,machine-learning,classification,semantic-web,Nlp,Machine Learning,Classification,Semantic Web,我正在做一些语义web/nlp研究,我有一组稀疏记录,包含数字和非数字数据的混合,表示从简单英语句子中提取的各种特征标记的实体 e、 g 单个实体可能出现多次(但每次都有不同的UID),并且可能与其其他引用具有重叠的特征。第二个数据集表示上述哪些UID绝对相同 e、 g 我将使用什么算法来增量地训练一个分类器,该分类器可以接受一组特征,并立即推荐N个最相似的UID,以及这些UID是否实际代表相同的实体的概率?或者,我还希望得到一个缺少特征的建议,以填充这些特征,然后重新分类以获得更确定的匹配 研

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

e、 g

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

e、 g

我将使用什么算法来增量地训练一个分类器,该分类器可以接受一组特征,并立即推荐N个最相似的UID,以及这些UID是否实际代表相同的实体的概率?或者,我还希望得到一个缺少特征的建议,以填充这些特征,然后重新分类以获得更确定的匹配

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

作为非常幼稚的第一次尝试,我考虑使用幼稚的贝叶斯分类器,将每个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),但增量培训支持将允许更新更快地进行


什么是更好的方法?

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

您可能想看看半监督聚类。在谷歌的一次简短搜索中发现了这篇论文,该论文给出了一种增量/活动算法的伪代码,并在某种意义上使用了监控,即它需要指示哪些实体在同一集群中或不在同一集群中的训练数据。您可以很容易地从sameas数据中得出这一点,假设(例如)UID
87w39423
4535k3l535
绝对是不同的东西

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

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


如果您想回答的问题类似于“给定一个实体,哪些其他实体可能引用相同的东西?”的话,可能还有其他合适的方法,但我不认为这是您想要的。

您可能想看看这种方法:

“通过排名实现图像相似性的大规模在线学习”,Gal Chechik、Varun Sharma、Uri Shalit和Samy Bengio,《机器学习研究杂志》(2010年)。 [][]

更多想法:


你所说的“实体”是什么意思?实体是被称为“obj_”的事物吗?您是否使用“obj_called”的内容来匹配不同的实体,例如“John”与“John Doe”相似?你是否使用句子之间的接近来表示类似的实体?映射的更大目标(任务)是什么?

有趣的问题,和往常一样。当你说你想进行增量训练时,这是否意味着你获得了更多的实体数据、更多的“相同”数据或两者兼而有之?这是一个有趣的想法。然而,我仍然认为这是一个分类问题,而不是聚类问题的原因是,聚类通常试图在没有任何置信度评分的情况下将向量拟合到单个聚类中。我想你可以用距离度量来衡量向量离每个簇有多远,但我不确定这会转化为概率。@Cerin所以,问题是你需要某种隶属度的置信度,你想要一个实际的成员概率,还是想要实体拥有多个集群的成员资格?@Cerin如中所示,一个给定的实体可以真正属于多个“事物”(根据基本事实),这是一个好问题。我想得越多,监督聚类==分类似乎就越多。我想我正在寻找一个属于多个组/事物的实体。例如,“我的苹果”可能属于一个“东西”,代表属于我的特定苹果,但它也可能属于另一个“东西”,代表“水果”,以及其他代表超词/全名的组。我认为监督聚类很像一种生成分类算法(例如naive bayes),对于像逻辑回归这样有区别的东西,情况就不是这样了。然而,上面的算法是半监督的,所以它在未标记的示例上训练其模型。它更像是一个“虚拟”对象,类似于聚类算法中的组概念。更大的目标是通过将引用同一实体的独立句子中定义的属性链接在一起,更好地从自然语言构建模型。i、 我只是想更好地理解“实体识别”的主题。
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']