当某些字母发生变化时如何在复数中找到单数?什么是最好的方法?
How to find singular in the plural when some letters change? What is the best approach?
当某些字母发生变化时,如何在复数中找到单数?
以下情况:
- 德语单词
Schließfach
是一个密码箱。
- 复数是
Schließfächer.
如您所见,字母 a
在 ä
中发生了变化。因此,第一个单词不再是第二个单词的子串,它们在“正则表达式技术上”是不同的。
也许我在下面选择的标签不正确。也许正则表达式不适合我。我已经看到 naturaljs
(natural.NounIflector()
) 为英文单词提供了开箱即用的功能。也许德语也有同样的解决方案?
什么是最好的方法,如何在德语中找到复数中的单数?
我曾经不得不构建一个文本处理器来解析多种语言,包括非常随意到非常正式的语言。要确定的事情之一是某些词是否相关(例如标题中的名词与事物列表相关 - 有时用复数形式标记。)
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.
您可以使用 nlp.js 库中的词干分析器(实际上是词形还原器),该库具有 40 种语言的模型。
const { StemmerDe } = require('@nlpjs/lang-de');
const stemmer = new StemmerDe();
console.log(stemmer.stemWord('Schließfach'));
console.log(stemmer.stemWord('Schließfächer'));
当某些字母发生变化时,如何在复数中找到单数?
以下情况:
- 德语单词
Schließfach
是一个密码箱。 - 复数是
Schließfächer.
如您所见,字母 a
在 ä
中发生了变化。因此,第一个单词不再是第二个单词的子串,它们在“正则表达式技术上”是不同的。
也许我在下面选择的标签不正确。也许正则表达式不适合我。我已经看到 naturaljs
(natural.NounIflector()
) 为英文单词提供了开箱即用的功能。也许德语也有同样的解决方案?
什么是最好的方法,如何在德语中找到复数中的单数?
我曾经不得不构建一个文本处理器来解析多种语言,包括非常随意到非常正式的语言。要确定的事情之一是某些词是否相关(例如标题中的名词与事物列表相关 - 有时用复数形式标记。)
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.
您可以使用 nlp.js 库中的词干分析器(实际上是词形还原器),该库具有 40 种语言的模型。
const { StemmerDe } = require('@nlpjs/lang-de');
const stemmer = new StemmerDe();
console.log(stemmer.stemWord('Schließfach'));
console.log(stemmer.stemWord('Schließfächer'));