如何使用pyhunspell向.dic / .aff文件添加新单词?

时间:2015-08-10 08:05:46

标签: python c python-3.x spell-checking hunspell

我正在使用pyhunspell这是一个围绕HunSpell的python包装器,一个基于.dic / .aff文件的拼写检查器,词干分析器,字分析器。 pyhunspell的文档是found here。不幸的是,doc页面没有演示如何在字典中添加新单词 /通过Python脚本扩展字典 。但pyhunspell的{​​{1}}包含add()函数,但与其他函数不同,add()没有解释,例如这个函数期待什么参数。有没有人设法之前调用过这个函数,可以给我一个例子来说明如何使用这个add()函数吗?

这是我想要调用的函数的C源代码,但是我的C太有限了,无法理解这里发生了什么。

static PyObject *
HunSpell_add(HunSpell * self, PyObject *args)
{
    char *word;
    int retvalue;

    if (!PyArg_ParseTuple(args, "s", &word))
        return NULL;
    retvalue = Hunspell_add(self->handle, word);

    return Py_BuildValue("i", retvalue);
}

static PyObject *
HunSpell_add_with_affix(HunSpell * self, PyObject *args)
{
    char *word, *example;
    int retvalue;

    if (!PyArg_ParseTuple(args, "ss", &word, &example))
        return NULL;
    retvalue = Hunspell_add_with_affix(self->handle, word, example);

    return Py_BuildValue("i", retvalue);
}

谢谢。

更新:

正如@RedX暗示的那样,我尝试使用1或2个参数调用add()函数。以下是我的发现:

例如,我使用hu_HU(匈牙利语)字典文件(.dic和.aff),这是我需要使用专用域词汇表扩展应用程序的文件。为了让这个例子对英语使用者保持透明,我选择了一个名字(McNamara),这个名字还没有包括在hu_HU词典中。由于匈牙利语是一种形态上非常丰富的语言,我需要关心这个词的偏差,否则词语的干扰将无法奏效。

McNamara遵循与Tamara相同的偏角模式,该模式已经被识别并且可以正确地阻止,例如对于Tamarával这个词(“与Tamara”)

import hunspell

hobj = hunspell.HunSpell('/usr/share/hunspell/hu_HU.dic', '/usr/share/hunspell/hu_HU.aff')
stem = hobj.stem("Tamarával")
print(stem)

将输出['Tamara'],这是正确的。

现在,如果我尝试使用新单词和示例调用add():

import hunspell

hobj = hunspell.HunSpell('/usr/share/hunspell/hu_HU.dic', '/usr/share/hunspell/hu_HU.aff')
hobj.add("McNamara", "Tamara")

这会给我一个TypeError: function takes exactly 1 argument (2 given)。然而@RedX基于C代码的建议似乎是合乎逻辑的。

此外,如果我用一个参数调用add(“McNamara”),它似乎只为当前会话添加新单词,而不是下一次运行脚本,例如:

hobj.add("McNamara")
print(hobj.spell("McNamara"))

这会打印True,但下次我只使用最后一行运行脚本时,它将返回False

1 个答案:

答案 0 :(得分:1)

您错过了C绑定代码中的详细信息。有两种不同的功能。

  • fisrt one是add,它在当前使用的dict中添加了一个单词(仅用于运行时)。它允许您在其上调用spell
  • 第二个是add_with_affix,它允许您在字典中添加一个单词并从另一个单词中复制标记。

例如(处理法语词典):

>>> hf.spell("pipoteuse")
False  # word not in the dict
>>> hf.stem("pipoteuses")  # try some classic plural stem
[]  # no stem
>>> hf.analyze("pipoteuse")
[]  # no analysis
>>> hf.add_with_affix("pipoteuse", "chanteuse")
0  # 0 = succesful operation
>>> hf.spell("pipoteuse")
True   # word in the dict now
>>> hf.analyze('pipoteuse')
[b' st:pipoteuse is:fem is:sg']  # flags copied from "chanteuse", is feminin singular and stem is itself (like chanteuse)
>>> hf.stem("pipoteuses")
[b'pipoteuse']  # now stem the plural of this fake word

途中有一些链接更新: