我是一名语义网/自然语言处理研究人员,手头有一组稀疏记录,包含数字和非数字数据的混合体,这些数据代表了从简单英语句子中提取出的各种特征标注实体。
例如:
我应该使用哪些算法来增量式地训练一个分类器,可以接受一组特征,并立即推荐N个最相似的UID以及这些UID实际上是否代表了同一实体的概率?可选地,我还想获得缺失功能的建议,以填充并重新分类以获得更确定的匹配。
我研究了传统的近似最近邻算法,例如FLANN和ANN,我认为它们不适合,因为它们不能进行可监督学习的训练,也通常不设计用于稀疏的非数值输入。
作为第一个非常天真的尝试,我考虑使用朴素贝叶斯分类器,将每个SameAs关系转换为一组训练样本。因此,对于每个具有B SameAs关系的实体A,我将遍历每个关系并进行如下训练:
然后像这样使用它:
这种方法有多可行?最初的批量训练将非常缓慢,至少是O(N^2),但增量训练支持将允许更快地进行更新。
有更好的方法吗?
例如:
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 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),但增量训练支持将允许更快地进行更新。
有更好的方法吗?