1 回答
TA贡献1765条经验 获得超5个赞
我曾经不得不构建一个文本处理器来解析多种语言,包括非常随意的语言和非常正式的语言。需要确定的一件事是某些单词是否相关(例如标题中的名词与一系列事物相关 - 有时用复数形式标记。)
IIRC,我们支持的所有语言中 70-90% 的单数和复数单词形式的“编辑距离”小于 3 或 4。(最终添加了多个词典来提高准确性,因为“距离”本身就会产生许多误报。)另一个有趣的发现是,单词越长,距离等于或小于 3 的距离就越有可能意味着意义上的关系。
这是我们使用的库的示例:
const fastLevenshtein = require('fast-levenshtein');
console.log('Deburred Distances:')
console.log('Score 1:', fastLevenshtein.get('Schließfächer', 'Schließfach'));
// -> 3
console.log('Score 2:', fastLevenshtein.get('Blumtach', 'Blumtächer'));
// -> 3
console.log('Score 3:', fastLevenshtein.get('schließfächer', 'Schliessfaech'));
// -> 7
console.log('Score 4:', fastLevenshtein.get('not-it', 'Schliessfaech'));
// -> 12
console.log('Score 5:', fastLevenshtein.get('not-it', 'Schiesse'));
// -> 8
/**
* Additional strategy for dealing with other various languages:
* "Deburr" the strings to omit diacritics before checking the distance:
*/
const deburr = require('lodash.deburr');
console.log('Deburred Distances:')
console.log('Score 1:', deburr(fastLevenshtein.get('Schließfächer', 'Schließfach')));
// -> 3
console.log('Score 2:', deburr(fastLevenshtein.get('Blumtach', 'Blumtächer')));
// -> 3
console.log('Score 3:', deburr(fastLevenshtein.get('schließfächer', 'Schliessfaech')));
// -> 7
// Same in this case, but helpful in other similar use cases.
添加回答
举报