(最初的问题是关于为一个给定的单词生成所有形式。这个答案侧重于为字典的所有单词生成所有形式的更难的问题。我在这里发布这个,因为这是在搜索更难的问题时出现的问题。)
更新unmunch
_
截至 2021 年,Hunspell 提供了两种工具,称为unmunch
和wordforms
生成词形。它们各自的用法是:
# 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
应该是最新的,所以你可能会尝试模仿unmunch
with wordforms
(正如自述文件所建议的那样),但后者只取一个不合格的根,并将其与roots.dic
and所暗示的整个字典进行比较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的自述文件。