【问题标题】:Generate all word forms using Lucene & Hunspell使用 Lucene 和 Hunspell 生成所有单词形式
【发布时间】:2012-12-05 14:51:43
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: lucene nlp word hunspell


    【解决方案1】:

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

     unmunch en_GB.dic en_GB.aff
    

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

    【讨论】:

    • 非常感谢丹尼尔的回答!我知道unmunch。对于我想添加一个新词的用例,调用它不是一个选项,我想预览它的所有形式。我确实尝试在源代码中查找它是如何实现的,但后来我想:如果它已经在 Lucene 中实现了,那么我就不必产生一个新的 buggy 端口,它会与 Lucene 的其他部分保持一致。跨度>
    • @HarisOsmanagić,在我看来,恰恰相反,它正是您要找的东西。您可以在自定义 .dic 文件中使用词缀规则(例如 educate/ABC)编写新词根,然后使用此自定义词典和您的语言的标准词缀文件调用 unmunch
    【解决方案2】:

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

    the documentation阅读更多内容。

    【讨论】:

    • 你知道这是否可以从 Lucene 调用吗?
    • 如何将输出写入文件?
    • 它似乎不太好用:您缺少“教育”、“教育”、“教育”、“教育”等,并且重复了“教育”。
    • @dardo82 结果取决于所提供词典的质量。我的输出[教育,教育,教育,教育,教育,教育] 所以不是你列出的所有东西,而是更好。
    • @byoungb 你用的是什么字典?
    【解决方案3】:

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

    unmunching 更新

    截至 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(正如自述文件所建议的那样),但是后者只取一个不合格的根,并将其与roots.dicaffixes.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 缺少替代品是a known issue。显然,Hunspell 开发人员不会在可预见的未来解决这个问题(关于资金的问题?)。这导致几个人重新实现了该功能,您会在整个 GitHub 问题中找到指针。

    • 2012年有人通过改编wordforms的源代码写了an sh/awk script;可能已经严重过时了,但我还没有尝试过。
    • 2014年有人写another sh/awk script来处理印地语词典;它对我有用,至少比内置的 unmunch 好。不过我不知道它有多准确。
    • 2020年12月有人写了a Perl modulea Perl program;看起来不错,但我不知道如何使用它们。

    ¹ 来自 the repo 的自述文件。

    【讨论】:

      【解决方案4】:

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

      1
      word/abc
      

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

      unmunch word.dic en_US.aff
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-09-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多