问题描述
我正在尝试使用以下终端命令在 Ubuntu 20.10 上使用 MeCab 0.996 构建 UniDic CWJ 2.3.0 用户字典:
$ /usr/local/libexec/mecab/mecab-dict-index -d /usr/local/lib/unidic/unidic-cwj-2.3.0 -u ~/foo/bar/foo.dic -f utf8 -t utf8 ~/foo/bar/foo.csv
foo.csv 在哪里:
ダイバーシティ,-200,名詞,普通名詞,一般,*,ダイバーシティ,ダイバーシティ-diversity,外,体,
但我收到此错误:
dictionary.cpp(355) [cid->left_size() == matrix.left_size() && cid->right_size() == matrix.right_size()] Context ID files(/usr/local/lib/unidic/unidic-cwj-2.3.0/left-id.def or /usr/local/lib/unidic/unidic-cwj-2.3.0/right-id.def may be broken
这个未解决的 GitHub 问题帖子似乎是相关的,但让我无法理解:https://github.com/taku910/mecab/issues/42
我可以使用旧版 unidic-mecab-2.1.2 构建 MeCab 用户词典:
$ /usr/local/libexec/mecab/mecab-dict-index -d ~/mecab/unidic-mecab-2.1.2_src/ -u ~/foo/bar/foo.dic -f utf8 -t utf8 ~/foo/bar/foo.csv
./pos-id.def is not found. minimum setting is used
emitting double-array: 100% |###########################################|
done!
我还可以使用 unidic-py documentation 中的 reiwa.33.csv 构建用户词典:
/usr/local/libexec/mecab/mecab-dict-index -d /usr/local/lib/unidic/unidic-cwj-2.3.0 -u ~/foo/bar/reiwa33.dic -f utf8 -t utf8 ~/foo/bar/reiwa.33.csv
/usr/local/lib/unidic/unidic-cwj-2.3.0/pos-id.def is not found. minimum setting is used
reading /home/foo/bar/reiwa.33.csv ... 3
emitting double-array: 100% |###########################################|
done!
reiwa.33.csv 是:
令和,4786,8205,固有名詞,レイワ,令和,レーワ,固,"1,0",*
㋿,5969,2588,補助記号,㋿,記号,999999
㋿,3992,*
因此,两个 csv 文件之间的区别在于,reiwa.33.csv 中为每个表面形式指定了左右上下文 ID(以及一些但不是所有条目的 aType 和 lemma_id),而不是在foo.csv。
根据 MeCab 的 instructions,mecab-dict-index 会自动分配左右 ID,unidic-mecab-2.1.2 似乎是这种情况,但 UniDic 2.3 不是这样。 0.
所以,我想问题变成了:如何确定左右上下文 ID 应该是什么?有什么解释吗?
解决方法
我能够在 this Qiita post 中找到答案。
要确定左右上下文 ID:
- 分别查看 left-id.def 和 right-id.def 文件:
$ gedit /usr/local/lib/unidic/unidic-cwj-2.3.0/left-id.def
$ gedit /usr/local/lib/unidic/unidic-cwj-2.3.0/right-id.def
-
找到与单词特征匹配的行。
对于一般的外来词名词(例如,ダイバーシティ) 指定的重音类型 (aType) 或重音更改类型 (aConType) 值是:
left-id: 15917 名詞,普通名詞,一般,*,外,*
right-id: 17160 名詞,*
- 因此 foo.csv 应该是:
ダイバーシティ,15917,17160,-200,名詞,ダイバーシティ,ダイバーシティ-diversity,体,*
- 从 foo.csv 使用 UniDic CWJ 2.3.0 编译 MeCab 字典,然后在没有“left-或 right-id.def 可能被破坏的错误”的情况下工作:
$ /usr/local/libexec/mecab/mecab-dict-index -d /usr/local/lib/unidic/unidic-cwj-2.3.0/ -u ~/foo/bar/foo.dic -f utf8 -t utf8 ~/foo/bar/foo.csv
/usr/local/lib/unidic/unidic-cwj-2.3.0/pos-id.def is not found. minimum setting is used
reading /home/foo/bar/foo.csv ... 1
emitting double-array: 100% |###########################################|
done!
注意:reiwa.33.csv 中的值似乎适用于 UniDic 2.1.2。
有关为什么会出现 left/right-id.def 错误以及如何交换 matrix.def 中所有左右值的详细说明,请参阅 this Japanese Stack Overflow post。