使用Lucene和Hunspell生成所有单词形式

lpwwtiir  于 2022-11-07  发布在  Lucene
关注(0)|答案(4)|浏览(212)

在我的一个应用程序中,我们使用Lucene Analyzer,特别是它的Hunspell部分。我面临的问题是:我需要使用一组词缀规则生成一个单词的所有单词形式。
例如,有单词“educate”和词缀规则ABC,生成单词“educate”的所有形式。- educates、educated、educative等。
我想知道的是:是否可以使用Lucene Hunspell实现(我们使用了一个Hunspell字典(.dic)和附加文件(.aff),因此它必须是一个Hunspell API)?Lucene的Hunspell API并不是很大,我仔细检查了一下,没有找到合适的东西。
我能在SO上找到的最接近的是this,但没有与hunspell相关的答案。

Update 1我现在已经不再从事我曾经遇到过上述问题的项目了,但是如果仍然有一个使用Lucene的Analyzer来实现这一点的解决方案,我很高兴社区能够看到答案。

wnrlj8wa

wnrlj8wa1#

Hunspell附带了unmunch命令,它会创建所有的单词形式。你可以这样调用它:

unmunch en_GB.dic en_GB.aff

因此,你可以在hunspell源代码中查看它是如何实现的,以及是否可以从外部调用它。上次我检查过这个命令在使用复合词的字典时有点bug--在这种情况下,你无论如何都不能创建 all wordforms,因为它们有无限多个。

dxxyhpgq

dxxyhpgq2#

我想你要找的是Hunspell的单词形式命令:

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

请参阅the documentation中的更多内容。

dfddblmv

dfddblmv3#

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

unmunch ing上更新

截至2021年,Hunspell提供了两个生成单词形式的工具,分别称为unmunchwordforms,它们的用法分别是:


# print all forms for all words whose roots are given in `roots.dic`

# and make use of affix rules defined in `affixes.aff`:

unmunch   roots.dic affixes.aff

# print the forms of ONE given word (a single root with no affix rule)

# which are allowed by the reference dictionary defined by the pair of

# `roots.dic` and `affixes.aff`:

wordforms affixes.aff roots.dic word

因此,affixes.aff将由您的语言给定,而roots.dic将是您的语言的参考词典,或者是包含您要生成的新词的词根的自定义词典。

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

wordforms应该是最新的,因此您 * 可以尝试 * 用wordforms模拟unmunch(正如README所建议的那样),* 但是 * 后者只接受 * 一个 * 非限定根,并将其与roots.dicaffixes.aff所隐含的整个字典进行比较。你必须用roots.dic中的所有词根依次调用wordforms。所以你会有一个二次时间。对我来说,用法语的词缀参考集,这是缓慢到不可用的地步-即使只有10个词根!不可用的Bash代码是,举例来说:


# /!\ EXTREMELY SLOW

aff='affixes.aff'
dic='roots.dic'
cat "$dic" | while read -r root ; do # read each root of the file
    root="${root%%/*}" # strip the root from the optional slash (attached affix rules)
    wordforms "$aff" "$dic" "$root" # generate all forms for this root
done \
| sort -u # sort (according to the locale) and remove duplicates

此外,请注意wordforms生成的是裸词,而unmunch能够附加派生的元数据(如词性或性别),因此使用wordforms时,您会丢失信息(这可能对您很重要,也可能不重要)。
unmunch的替代品是a known issue。显然,Hunspell开发者不会在可预测的未来解决这个问题(关于资金的问题?)。这导致了一些人重新实现了这个功能,你可以在GitHub问题中找到指针。

  • 2012年有人通过改编wordforms的源代码编写了an sh/awk script;也许已经过时了,但我还没试过
  • 2014年有人写了another sh/awk script来治疗一本印地语词典;它对我来说很有效,至少比内置的unmunch好。虽然我不知道它有多准确。
  • 2020年12月有人写了a Perl module和一个Perl程序;看起来不错,但我不知道如何使用它们。

¹摘自the repo的自述文件。

rbpvctlc

rbpvctlc4#

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

1
word/abc

并将其另存为word.dic。用途:

unmunch word.dic en_US.aff

你会得到所有被创造出来的单词形式。

相关问题