nlp.js Compound words in NER

0ejtzxu1  于 23天前  发布在  其他
关注(0)|答案(2)|浏览(19)

复合词在nlp.js中的NER表现不佳。例如,根据nlp.js,蜘蛛侠是一只蜘蛛,但不是一个人。空格似乎具有过多的意义。根据nlp.js,Spider-Man或Spider Man无疑是一只蜘蛛和一个人。我看不到这种区分的意义。尤其是在芬兰语中,这是一个关键问题。我们有很多复合词。如果nlp.js能够在这个情况下配置成不同的行为,那就太好了。

var {NerManager} = require('node-nlp');
manager = new NerManager({threshold:0.1});
manager.addNamedEntityText('species', 'spider', 'en', ['spider']);
manager.addNamedEntityText('species', 'man', 'en', ['man']);
manager.findEntities('spiderman', 'fi').then(entities => console.log(entities));
manager.findEntities('spider man', 'fi').then(entities => console.log(entities));
manager.findEntities('spider-man', 'fi').then(entities => console.log(entities));

spiderman返回

[ { start: 0,
    end: 8,
    len: 9,
    levenshtein: 3,
    accuracy: 0.5,
    option: 'spider',
    sourceText: 'spider',
    entity: 'species',
    utteranceText: 'spiderman' } ]

spider man和spider-man都返回

[ { start: 0,
    end: 5,
    len: 6,
    levenshtein: 0,
    accuracy: 1,
    option: 'spider',
    sourceText: 'spider',
    entity: 'species',
    utteranceText: 'spider' },
  { start: 7,
    end: 9,
    len: 3,
    levenshtein: 0,
    accuracy: 1,
    option: 'man',
    sourceText: 'man',
    entity: 'species',
    utteranceText: 'man' } ]
new9mtju

new9mtju1#

你好,在这个情况下,是因为这个函数:
https://github.com/axa-group/nlp.js/blob/master/lib/util/similar-search.js#L135
这个函数根据单词是否为字母数字来提取单词位置。因此,也许可以实现基于语言的策略,就像每个语言的分词器一样。
有一个问题,你能解释一下在每种情况下你期望的结果是什么吗?"spider man","spiderman" 和 "spider-man"。
另外,对于 "spiderman",返回 "spider" 是因为提供的阈值非常低,当阈值大于0.5时,会返回空数组。

w7t8yxp5

w7t8yxp52#

你好,我希望它能返回蜘蛛和人。这样你就有更好的机会去发现任何新发明的超人。然而,这并不是一个比芬兰语中的例子更实用的例子:
kana-caesarsalaatti = 鸡肉凯撒沙拉
tonnikalapastasalaatti = 金枪鱼意大利面沙拉
pasta-kinkkusalaatti = 带火腿的意大利面沙拉
savukalasalaatti = 烟熏鱼沙拉
savuporosalaatti = 烟熏驯鹿沙拉
lohisalaatti = 鲑鱼沙拉
savulohi-vihannessalaatti = 带烟熏三文鱼和蔬菜的沙拉
savustettu lohi ja vihannessalaatti = 带烟熏三文鱼和蔬菜的沙拉
kylmäsavulohisalaatti = 冷烟熏三文鱼沙拉
sipuli-perunasalaatti = 洋葱土豆沙拉
tomaatti-mozzarellasalaatti = 番茄马苏里拉沙拉
peruna-broileri-juustosalaatti = 烤土豆芝士沙拉
grillikasvis-couscoussalaatti = 带烤蔬菜和库斯库斯的沙拉
savuhärkä-pastasalaatti = 带烟熏牛肉的意大利面沙拉
lohi-avokadosalaatti = 鲑鱼酸奶沙拉
kinkku-nuudelisalaatti = 火腿通心粉沙拉
seesamiahvensalaatti = 鳕鱼刺身沙拉
riisinuudelisalaatti = 大米通心粉沙拉
valkosipulisalaattikastike = 大蒜沙拉调料
yrtti-balsamicosalaattikastike = 香草巴玛臣沙拉调料
tomaatti-chilisalaattikastike = 番茄辣椒沙拉调料
我试着列出所有的沙拉或沙拉调料,或者只同意如果一个复合词以沙拉结尾,那么它就是沙拉;如果以沙拉调料结尾,那么它就是沙拉调料。然后如果我还有一份不同食材的清单,我可以告诉这是什么类型的沙拉或沙拉调料。然而,现在这是不可能的。

var {NerManager} = require('node-nlp');
var manager, entities;
manager = new NerManager({threshold: 0.1});
manager.addNamedEntityText('animal', 'poro', 'fi', ['poro']);
manager.addNamedEntityText('dish', 'salaatti', 'fi', ['salaatti']);
manager.addNamedEntityText('food', 'savuporo', 'fi', ['savuporo']);
manager.addNamedEntityText('process', 'savu', 'fi', ['savu']);
manager.findEntities('savuporosalaatti', 'fi').then(entities => console.log(entities));

返回[]

manager.findEntities('porosalaatti', 'fi').then(entities => console.log(entities));

返回

[{ start: 0,
    end: 11,
    len: 12,
    levenshtein: 4,
    accuracy: 0.5,
    option: 'salaatti',
    sourceText: 'salaatti',
    entity: 'dish',
    utteranceText: 'porosalaatti' } ]

但我仍然不知道这是什么类型的沙拉。我可以将savuporosalaatti添加为一个命名实体,但那是一个无尽的道路。想想同样的工作必须对任何一种菜肴都做一遍:面包、粥、汤、炖肉、煎蛋、寿司、玉米饼...为任何一种菜肴做好准备都比告诉人们他们可以吃哪种菜容易。
这变得更棘手了,因为savuporo是烟熏驯鹿,而savu只是烟。savustettu是烟熏的。几乎所有的肉都可以烟熏。savustettu lohi ja vihannessalaatti将是带有烟熏三文鱼和蔬菜的沙拉。savustettu lohi-vihannessalaatti意味着整个三文鱼蔬菜沙拉被烟熏,这是不寻常的,但我不会阻止你这样做。
尽管语法规则说正确的形式是valkosipulisalaattikastike,但有时你可以看到它写成 valkosipuli salaattikastike。因此,最好有一个可能性来找到形式为 /(food[\s|-]?)*dish/ 的实体。

相关问题