10

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

例如,拥有单词“educate”和词缀规则ABC,生成所有形式的单词“educate”。- 教育,教育,教育等。

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

我能在 SO 上找到的最近的是this,但没有与 hunspell 相关的答案。

更新 1我不再从事我面临上述问题的项目,但如果仍然有使用 Lucene 的分析器执行此操作的解决方案,我很高兴社区会看到答案。

4

4 回答 4

9

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

 unmunch en_GB.dic en_GB.aff

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

于 2012-12-05T17:39:54.083 回答
5

我认为您正在寻找的是 Hunspell 的 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

在文档中阅读更多内容。

于 2013-06-03T12:56:28.647 回答
3

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

更新unmunch_

截至 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

Soaffixes.aff将由您的语言给出,并且roots.dic可以是您的语言的参考词典,也可以是您想要生成的新词的根源的自定义词典。

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

wordforms应该是最新的,所以你可能会尝试模仿unmunchwith wordforms(正如自述文件所建议的那样),后者只取一个不合格的根,并将其与roots.dicand所暗示的整个字典进行比较affixes.aff。每个根都需要花费大量时间,最糟糕的是,您必须wordforms轮流调用所有根在roots.dic. 所以你会有一个二次时间。对我来说,使用法语的参考词缀集,这太慢了以至于无法使用——即使只有 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一个已知问题。显然,Hunspell 开发人员不会在可预见的未来解决这个问题(关于资金的问题?)。这导致几个人重新实现了该功能,您会在整个 GitHub 问题中找到指针。


¹ 来自repo的自述文件。

于 2021-03-16T18:49:39.777 回答
0

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

1
word/abc

并将其保存为 word.dic。利用:

unmunch word.dic en_US.aff

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

于 2020-12-07T15:09:57.013 回答