3

我正在使用位于https://github.com/FLCLjp/iPhone-libmecab的 MeCab 的 iPhone 库。我很难让它标记所有可能的单词。具体来说,我无法将“吉本兴业”分为“吉本”和“兴业”两部分。有什么选项可以用来解决这个问题吗?iPhone 库没有公开任何内容,但它在objective-c 包装器下使用C++。我认为必须有某种设置我可以更改以提供更细粒度的控制,但我不知道从哪里开始。

顺便说一句,如果有人想标记这个“mecab”,那可能是合适的。我还不允许创建新标签。

更新:iOS 库正在调用 libmecab.cpp 中定义的 mecab_sparse_tonode2()。如果有人可以向我指出该文件上的一些英文文档,那可能就足够了。

4

1 回答 1

10

这没有任何特定于 iOS 的内容。您与 mecab 一起使用的字典(可能是 ipadic)包含公司名称吉本兴业的条目。尽管名称的两个部分也被列为单独的名词,但 mecab 强烈倾向于将复合名称标记为一个单词。

Mecab 缺少允许用户选择是否应将化合物拆分为多个部分的功能。请注意,这样的功能通常很难实现,因为并不是每个人都同意哪些化合物可以拆分,哪些化合物不能拆分。例如容疑者是容疑和者的复合词吗?从纯粹的形态学角度来看可能是的,但对于大多数实际应用来说可能不是。

如果您有一个想要分割的化合物列表,一个快速的解决方法是为它们所包含的部分创建一个用户字典,并让 mecab 除了使用主字典之外还使用它。

这里有关于如何执行此操作的日语文档。对于您的特定示例,它将涉及以下步骤。

  1. 制作一个包含两个条目的用户字典,一个是吉本,一个是兴业:

    吉本,,,100,名詞,固有名詞,人名,名,*,*,よしもと,ヨシモト,ヨシモト
    興業,,,100,名詞,一般,*,*,*,*,こうぎょう,コウギョウ,コウギョウ
    

    我怀疑这两个条目已经存在于默认字典中,但是通过将它们添加到用户字典并指定一个相对较低的特异性指标(我都使用100过 - 越低,越有可能被拆分),您可以获得mecab 倾向于偏爱部分而不是整体。

  2. 编译用户字典:

    $> $MECAB/libexec/mecab/mecab-dict-index  -d /usr/lib64/mecab/dic/ipadic -u mydic.dic -f utf-8 -t utf-8 ./mydic
    

    您可能需要调整命令。以上假设:

    1. Mecab 是从$MECAB. 如果您使用由包管理器安装的 mecab,您可能很难找到该mecab-dict-index工具。最好从源安装。

    2. 默认字典在/usr/lib64/mecab/dict/ipadic. 这不是 mecab 包的一部分;它是一个单独的包(例如this),您可能也很难找到它。

    3. mydic是在步骤 1mydic.dic中创建的用户字典的名称。是您将作为输出获得的编译字典的名称(不需要存在)。

    4. 系统字典(-t选项)和用户字典(-f选项)都以 UTF-8 编码。这可能是错误的,在这种情况下,您稍后会在使用 mecab 时收到错误消息。

  3. 修改mecab配置。在系统范围的安装中,这是一个名为/usr/lib64/mecab/dic/ipadic/dicrc或类似的文件。在您的情况下,它可能位于其他地方。将以下行添加到配置文件的末尾:

    userdic = home/myhome/mydic.dic
    

    确保上面编译的字典的绝对路径是正确的。

如果您随后针对您的输入运行 mecab,它将将该化合物拆分为多个部分(我对其进行了测试,在 Linux 系统上使用 mecab 0.994)。

更彻底的解决方法是获取默认字典的来源并手动删除要拆分的所有复合名词,然后重新编译字典。作为一般评论,在较长一段时间内将 CJK 标记器用于生产模式中的严肃应用程序通常需要定期进行一定量的字典维护(添加/删除条目)。

于 2013-02-05T02:45:09.627 回答