【问题标题】:Hunspell affix condition regex format. Any way to match the start?Hunspell 词缀条件正则表达式格式。有什么方法可以匹配开始吗?
【发布时间】:2014-09-02 00:27:20
【问题描述】:

美好的一天。

我正在尝试在我的应用程序中使用 Hunspell 作为词干分析器。我不太喜欢搬运工和雪球词干,因为它们的“切碎”词结果如“abus”、“exampl”。 Lemmatizing 似乎是一个不错的选择,但我不知道任何好的 CoreNLP 替代方案,而且我当然还没有准备好将我的项目的源代码移植到 Java 或使用桥接器。理想情况下,我希望看到给定单词的初始形式,类似于字典中的形式。

我注意到大多数字典在 .dic 文件中都有单独的单词:bid and biding、set and setting、get and getting等等。我在 Hunspell 方面没有那么有经验,但没有处理 3 个字母单词的双 d 或 t 的聪明方法?有没有办法让它认为“设置”实际上是从“设置”派生的?

我目前对 Hunspell 的特殊问题是我无法获得用于创建/编辑词缀文件的良好综合文档。这就是文档所说的:http://manpages.ubuntu.com/manpages/dapper/man4/hunspell.4.html

(4) condition.

Zero stripping or affix are indicated by zero. Zero condition is
indicated   by   dot. Condition is a simplified, regular
expression-like pattern, which must be met before the affix  can
be  applied. (Dot  signs  an arbitrary character. Characters in
braces sign an arbitrary character from  the  character  subset.
Dash  hasn’t  got  special  meaning, but circumflex (^) next the
first brace sets the complementer character set.)

默认是这样的:

SFX G Y 2
SFX G   e     ing        e
SFX G   0     ing        [^e] 

我试过这个:

SFX G Y 4
SFX G   e     ing        e
SFX G   0     ing        [^e] 
SFX G   0     ting       [bcdfghjklmnpqrstvwxz][aeiou]t 
SFX G   0     ding       [bcdfghjklmnpqrstvwxz][aeiou]d 

但它显然也会匹配 asSET。有什么办法可以绕过它吗?我在正则表达式的开头尝试了 ^ 符号,但它似乎不起作用。我该怎么做才能让它发挥作用?

提前致谢。

【问题讨论】:

    标签: nlp stemming hunspell


    【解决方案1】:

    为什么它会匹配 asset?那不是动词,因此不应该附加那个后缀。

    语言不完全规则的问题。我们在 SoftAstur 的阿斯图里亚斯拼写检查器中使用的解决方案是跟踪以某种方式形成某些后缀的动词列表,并根据我们保留的列表构建 .dic 文件的脚本。

    所以对于英语,你需要定义两个独立的词缀1

    SFX Gs Y 3
    SFX Gs e ing [^eoy]e
    SFX Gs 0 ing [eoy]e
    SFX Gs 0 ing [^e]
    
    SFX Gd Y 9
    SFX 0 bing [^aeiou][aeiou]b
    SFX 0 king [^aeiou][aeiou]c
    SFX 0 ding [^aeiou][aeiou]d
    SFX 0 ling [^aeiou][aeiou]l   # for British English
    SFX 0 ming [^aeiou][aeiou]m
    SFX 0 ning [^aeiou][aeiou]n
    SFX 0 ping [^aeiou][aeiou]p
    SFX 0 ring [^aeiou][aeiou]r
    SFX 0 ting [^aeiou][aeiou]t
    

    还有其他不规则的,例如 singeing(与 singing 形成对比),它们并不常见,它们可能最好单独编码。因此,您的字典文件或多或少会像以下内容:

    admit/Gd    --> admitting
    bake/Gs     --> baking
    commit/Gd   --> committed
    free/Gs     --> freeing
    dye/Gs      --> dyeing
    inherit/Gs  --> inherited
    picnic/Gd   --> picnicking
    target/Gs   --> targetting
    tiptoe/Gs   --> tiptoeing
    travel/Gs   --> traveling  (if American English)
    travel/Gd   --> travelling (if British English)
    refer/Gd    --> referring
    sing/Gs     --> singing
    singe
    singing
    sob/Gd      --> sobbing
    smile/Gs    --> smiling
    stop/Gd     --> stopping
    tap/Gd      --> tapping
    visit/Gs    --> visiting
    

    1.我更喜欢两个字母的标签,因为如果你的单词有很多标签,它们会更容易阅读,例如 Gd = gerund doubledGs = gerund single em> 或类似的。对于英语来说可能不是问题,但对于其他语言来说肯定是这样。如果你没有很多词缀,你可以选择g(不加倍)和G(加倍)。

    【讨论】:

    • 嗯,这似乎是一种真正正确的方法。它看起来如此明显和简单,让我看到最初的问题是多么愚蠢。顺便说一句,这两个字母后缀名称背后的直觉很好。谢谢回答。我想知道是否有任何具有这种后缀格式的 Hunspell 字典。因为我目前使用的只有一个辅音后缀,并且只要有一个带有双辅音后缀的单词,它就会将其视为.dic文件中的排除项。
    • Hunspell 令人沮丧的原因有两个:它的文档记录不够完善,而且它需要准确的输入(将词缀数错了一个,它拒绝识别其中任何一个)。我强烈考虑根据我的经验编写教程,因为我们已经使用了所有功能,但复合词。它确实需要重写,但它的源代码几乎不可读且没有很好的注释。事实上,我可能会在某个时候重写,但我可能需要两年时间才能有时间。
    • @SimpleV 至于两个字母后缀的例子,我们的阿斯图里亚斯语使用它们,我想匈牙利语会因为这两个字母后缀,因为 Hunspell 旨在添加他们需要的匈牙利语功能。如果有其他高度合成的语言,他们可能会有——但如果你想要一个两个字母的词缀,它们都必须是两个字母。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-23
    • 1970-01-01
    • 2013-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多