WorksApplications / SudachiPy

Python version of Sudachi, a Japanese tokenizer.
Apache License 2.0
391 stars 50 forks source link

Problem with user defined dictionary #143

Open JSB97 opened 4 years ago

JSB97 commented 4 years ago

I am making use of sudachipy via ginza, and am trying to annotate the following sentences.

プロ野球の中日で選手、監督を務め、1月4日に70歳で死去した星野仙一氏をしのび、3日、名古屋市東区のナゴヤドームで行われた中日―楽天のオープン戦は追悼試合として開催された。
明治大の後輩、島内宏明外野手は「改めてすごい人だったんだなと思った」と話した。

And in my dictionary I have the following lines, which match 明治 and 楽天 in the above. There are no other lines in the dictionary that match any substrings in the sentence.

楽天,1288,1288,100,楽天_4755-2018,名詞,固有名詞,組織,上場会社,*,*,RAKUTEN,楽天,*,*,*,*,*
明治,1288,1288,100,明治_2261-2009,名詞,固有名詞,組織,上場会社,*,*,MEIJI,明治,*,*,*,*,*

When I try and run annotations with this configuration, i get the below error:

... 

  File "/Users/jb/.pyenv/versions/3.6.1/lib/python3.6/site-packages/spacy/language.py", line 441, in __call__
    doc = self.make_doc(text)
  File "/Users/jb/.pyenv/versions/3.6.1/lib/python3.6/site-packages/spacy/lang/ja/__init__.py", line 281, in make_doc
    return self.tokenizer(text)
  File "/Users/jb/.pyenv/versions/3.6.1/lib/python3.6/site-packages/spacy/lang/ja/__init__.py", line 144, in __call__
    dtokens = self._get_dtokens(sudachipy_tokens)
  File "/Users/jb/.pyenv/versions/3.6.1/lib/python3.6/site-packages/spacy/lang/ja/__init__.py", line 182, in _get_dtokens
    ) for idx, token in enumerate(sudachipy_tokens) if len(token.surface()) > 0
  File "/Users/jb/.pyenv/versions/3.6.1/lib/python3.6/site-packages/spacy/lang/ja/__init__.py", line 182, in <listcomp>
    ) for idx, token in enumerate(sudachipy_tokens) if len(token.surface()) > 0
  File "/Users/jb/.pyenv/versions/3.6.1/lib/python3.6/site-packages/sudachipy/morpheme.py", line 36, in part_of_speech
    return self.list.grammar.get_part_of_speech_string(wi.pos_id)
  File "/Users/jb/.pyenv/versions/3.6.1/lib/python3.6/site-packages/sudachipy/dictionarylib/grammar.py", line 55, in get_part_of_speech_string
    return self.pos_list[pos_id]
IndexError: list index out of range

Could someone advise me as to what is causing this error please?

I am quite certain the sentence with 明治 is causing the issue,as if i remove the second sentence, the annotation works fine. It therefore seems like 楽天 is being picked up by SudachiPy with the dictionary, but 明治 is not.

Why is this?

sorami commented 4 years ago

(ちなみに問い合わせは日本語でも問題ないです!)

Could you tell us how you built the user dictionary, and the piece of code which you got that error?

I cannot reproduce your error case; Ideally, we would want a minimal case that causes the error.

Here is a procedure I tried, which DID work without any errors;

$ cat userdict.csv
楽天,1288,1288,100,楽天_4755-2018,名詞,固有名詞,組織,上場会社,*,*,RAKUTEN,楽天,*,*,*,*,*
明治,1288,1288,100,明治_2261-2009,名詞,固有名詞,組織,上場会社,*,*,MEIJI,明治,*,*,*,*,*

$ sudachipy ubuild -o user.dic userdict.csv
reading the source file...2 words
writing the POS table...36 bytes
writing the connection matrix...4 bytes
building the trie...done
writing the trie...1028 bytes
writing the word-ID table...14 bytes
writing the word parameters...16 bytes
writing the word_infos...106 bytes
writing word_info offsets...8 bytes
$ ls -1
char.def
sudachi.json
test.txt
unk.def
user.dic
userdict.csv

$ echo 楽天明治 | sudachipy -r sudachi.json
楽天  名詞,固有名詞,組織,上場会社,*,* 楽天
明治  名詞,固有名詞,組織,上場会社,*,* 明治
EOS

$ cat test.txt
プロ野球の中日で選手、監督を務め、1月4日に70歳で死去した星野仙一氏をしのび、3日、名古屋市東区のナゴヤドームで行われた中日―楽天のオープン戦は追悼試合として開催された。
明治大の後輩、島内宏明外野手は「改めてすごい人だったんだなと思った」と話した。

$ sudachipy -r sudachi.json test.txt
プロ  名詞,普通名詞,一般,*,*,*    プロ
野球  名詞,普通名詞,一般,*,*,*    野球
の   助詞,格助詞,*,*,*,*  の
中日  名詞,固有名詞,一般,*,*,*    中日
で   助詞,格助詞,*,*,*,*  で
選手  名詞,普通名詞,一般,*,*,*    選手
、   補助記号,読点,*,*,*,* 、
監督  名詞,普通名詞,サ変可能,*,*,*  監督
を   助詞,格助詞,*,*,*,*  を
務め  動詞,一般,*,*,下一段-マ行,連用形-一般 勤める
、   補助記号,読点,*,*,*,* 、
1   名詞,数詞,*,*,*,*   1
月   名詞,普通名詞,助数詞可能,*,*,* 月
4   名詞,数詞,*,*,*,*   4
日   接尾辞,名詞的,助数詞,*,*,*   日
に   助詞,格助詞,*,*,*,*  に
70  名詞,数詞,*,*,*,*   70
歳   接尾辞,名詞的,助数詞,*,*,*   歳
で   助詞,格助詞,*,*,*,*  で
死去  名詞,普通名詞,サ変可能,*,*,*  死去
し   動詞,非自立可能,*,*,サ行変格,連用形-一般    為る
た   助動詞,*,*,*,助動詞-タ,連体形-一般  た
星野  名詞,固有名詞,人名,姓,*,*    星野
仙一  名詞,固有名詞,人名,名,*,*    仙一
氏   接尾辞,名詞的,一般,*,*,*    氏
を   助詞,格助詞,*,*,*,*  を
しのび 動詞,一般,*,*,五段-バ行,連用形-一般  しのぶ
、   補助記号,読点,*,*,*,* 、
3   名詞,数詞,*,*,*,*   3
日   接尾辞,名詞的,助数詞,*,*,*   日
、   補助記号,読点,*,*,*,* 、
名古屋市東区  名詞,固有名詞,地名,一般,*,*   名古屋市東区
の   助詞,格助詞,*,*,*,*  の
ナゴヤ 名詞,固有名詞,地名,一般,*,*   ナゴヤ
ドーム 名詞,普通名詞,一般,*,*,*    ドーム
で   助詞,格助詞,*,*,*,*  で
行わ  動詞,一般,*,*,五段-ワア行,未然形-一般 行う
れ   助動詞,*,*,*,助動詞-レル,連用形-一般 れる
た   助動詞,*,*,*,助動詞-タ,連体形-一般  た
中日  名詞,固有名詞,一般,*,*,*    中日
―   補助記号,一般,*,*,*,* ―
楽天  名詞,固有名詞,組織,上場会社,*,* 楽天
の   助詞,格助詞,*,*,*,*  の
オープン戦   名詞,普通名詞,一般,*,*,*    オープン戦
は   助詞,係助詞,*,*,*,*  は
追悼  名詞,普通名詞,サ変可能,*,*,*  追悼
試合  名詞,普通名詞,サ変可能,*,*,*  試合
と   助詞,格助詞,*,*,*,*  と
し   動詞,非自立可能,*,*,サ行変格,連用形-一般    為る
て   助詞,接続助詞,*,*,*,* て
開催  名詞,普通名詞,サ変可能,*,*,*  開催
さ   動詞,非自立可能,*,*,サ行変格,未然形-サ 為る
れ   助動詞,*,*,*,助動詞-レル,連用形-一般 れる
た   助動詞,*,*,*,助動詞-タ,終止形-一般  た
。   補助記号,句点,*,*,*,* 。
EOS
明治  名詞,固有名詞,組織,上場会社,*,* 明治
大   接尾辞,名詞的,一般,*,*,*    大
の   助詞,格助詞,*,*,*,*  の
後輩  名詞,普通名詞,一般,*,*,*    後輩
、   補助記号,読点,*,*,*,* 、
島内  名詞,固有名詞,人名,姓,*,*    島内
宏明  名詞,固有名詞,人名,名,*,*    宏明
外野手 名詞,普通名詞,一般,*,*,*    外野手
は   助詞,係助詞,*,*,*,*  は
「   補助記号,括弧開,*,*,*,*    「
改めて 副詞,*,*,*,*,*    改めて
すごい 形容詞,一般,*,*,形容詞,連体形-一般   凄い
人   名詞,普通名詞,一般,*,*,*    人
だっ  助動詞,*,*,*,助動詞-ダ,連用形-促音便 だ
た   助動詞,*,*,*,助動詞-タ,連体形-一般  た
ん   助詞,準体助詞,*,*,*,* の
だ   助動詞,*,*,*,助動詞-ダ,終止形-一般  だ
な   助詞,終助詞,*,*,*,*  な
と   助詞,格助詞,*,*,*,*  と
思っ  動詞,一般,*,*,五段-ワア行,連用形-促音便    思う
た   助動詞,*,*,*,助動詞-タ,終止形-一般  た
」   補助記号,括弧閉,*,*,*,*    」
と   助詞,格助詞,*,*,*,*  と
話し  動詞,一般,*,*,五段-サ行,連用形-一般  話す
た   助動詞,*,*,*,助動詞-タ,終止形-一般  た
。   補助記号,句点,*,*,*,* 。
EOS