使用Lucene&;亨斯佩尔

使用Lucene&;亨斯佩尔,lucene,nlp,word,hunspell,Lucene,Nlp,Word,Hunspell,在我工作的一个应用程序中,我们使用Lucene Analyzer,尤其是它的拼写部分。我面临的问题是:我需要使用一组词缀规则生成一个单词的所有单词形式 例如,使用“教育”一词并附加规则ABC,生成各种形式的“教育”一词 我想知道的是:是否可以使用Lucene的Hunspell实现(我们使用Hunspell字典(.dic)和词缀文件(.aff),所以它必须是Hunspell API)?Lucene的Hunspell API没有那么大,我检查了一下,没有找到合适的 我能找到的最近的是SO was,但

在我工作的一个应用程序中,我们使用Lucene Analyzer,尤其是它的拼写部分。我面临的问题是:我需要使用一组词缀规则生成一个单词的所有单词形式

例如,使用“教育”一词并附加规则ABC,生成各种形式的“教育”一词

我想知道的是:是否可以使用Lucene的Hunspell实现(我们使用Hunspell字典(.dic)和词缀文件(.aff),所以它必须是Hunspell API)?Lucene的Hunspell API没有那么大,我检查了一下,没有找到合适的

我能找到的最近的是SO was,但并没有关于拼写的答案


更新1我不再从事我面临上述问题的项目,但如果仍然有使用Lucene的Analyzer实现这一点的解决方案,我很高兴社区会看到答案。

Hunspill附带unmunch命令,该命令将创建所有单词形式。你可以这样称呼它:

 unmunch en_GB.dic en_GB.aff

因此,您可以在源代码中查看这是如何实现的,以及是否可以从外部调用它。上次我在带有复合词的词典上使用该命令时,该命令有点错误-在这种情况下,您无论如何都无法创建所有的wordforms,因为它们的数量是无限的。

我想您需要的是Hunspill的wordforms命令:

Usage: wordforms [-s | -p] dictionary.aff dictionary.dic word
-s: print only suffixed forms
-p: print only prefixed forms
例如:

$ wordforms en_US.aff en_US.dic educate
educating
educated
educate
educates
educates

阅读更多信息。

要查找一个单词的所有创建形式,假设en_US.dic包含:word/abc,请创建一个文件:

1
word/abc
并将其另存为word.dic。使用:

unmunch word.dic en_US.aff
你可以得到所有创建的单词形式。

(最初的问题是关于为一个给定的单词生成所有形式。这个答案集中在为字典中的所有单词生成所有形式这一更难的问题上。我在这里发布这篇文章,因为这是在搜索更难的问题时出现的。)

取消咀嚼更新 截至2021年,Hunspill提供了两种工具,分别称为
unmunch
wordforms
,用于生成单词表单。它们各自的用途是:

#打印所有词根在'roots.dic'中的单词的所有表格`
#并使用“affixes.aff”中定义的词缀规则:
unmunch root.dic affixes.aff
#打印一个给定单词的形式(单根,无词缀规则)
#由一对
#'root.dic'和'affixes.aff':
词形词缀.aff词根.dic单词
因此,
词缀.aff
将由您的语言给出,而
词根.dic
将是您的语言的参考词典,或者是包含要生成的新词词根的自定义词典

不幸的是,Hunspell的
unmunch
已被弃用,无法正常工作。
它是从MySpell继承的,我猜它不支持Hunspell的所有功能。显然,它不支持UTF-8。当我尝试将它与参考法语词典(Dicollecte,v7.0)一起使用时,它通过应用不应该应用的词缀规则(例如:非动词的变位)生成了垃圾词

wordforms
应该是最新的,因此您可以尝试用
wordforms
模拟
unmunch
(如自述文件所示),但后者只取一个非限定根,并将其与
根.dic
词缀.aff所隐含的整个词典进行比较。这需要每个根花费大量时间,最糟糕的是,您必须依次调用
wordforms
,所有根都位于
roots.dic
。所以你会有一个二次时间。对我来说,对于法语的词缀参考集来说,即使只有10个词根,这也慢到了无法使用的地步!不可用的Bash代码如下所示:

#/!\极其缓慢
aff='affixes.aff'
dic='根,dic'
cat“$dic”|而read-r root;是否读取文件的每个根目录
root=“${root%%/*}”#从可选斜杠中删除根(附加的词缀规则)
wordforms“$aff”“$dic”“$root”#生成此根目录的所有表单
完成\
|排序-u#排序(根据区域设置)并删除重复项
另外,请注意,
wordforms
生成裸词,而
unmunch
能够附加派生元数据(例如词性或性别),因此使用
wordforms
会丢失信息(这可能对您来说很重要,也可能对您来说无关紧要)

缺少
unmunch
的替代品是很重要的。显然,开发者不会在可预测的未来解决这个问题(关于资金的问题?)。这导致了一些人重新实现了该功能,您可以在GitHub问题中找到一些指针

  • 2012年,有人修改了
    wordforms
    的源代码;也许已经严重过时了,但我还没试过
  • 2014年,有人写信给一本印地语词典;它对我很有效,至少比内置的
    unmunch
    更好。不过我不知道它有多准确
  • 2020年12月,有人写了一封信;看起来不错,但我不知道怎么用


来自的自述。

非常感谢您的回答,丹尼尔!我知道unmunch。在我想要添加一个新词,并且想要预览它的所有形式的用例中,调用它不是一个选项。我确实试着在源代码中查找它是如何实现的,但后来我想:如果它已经在Lucene中实现了,那么我就不必生成一个新的buggy端口,它将与Lucene的其他部分保持一致。@HarisOsmanagić,在我看来,它恰恰相反,是您所寻找的。您可以在自定义.dic文件中使用词缀规则(例如,
educate/ABC
)编写新词词根,然后使用此自定义词典和您的语言的标准词缀文件调用
unmunch
。您知道这是否可以从Lucene调用吗?我如何编写