mocobeta / janome

Japanese morphological analysis engine written in pure Python
https://mocobeta.github.io/janome/en/
Apache License 2.0
855 stars 51 forks source link

ユーザー定義辞書で定義した内容が期待通りに抽出されない #114

Closed epersona closed 1 year ago

epersona commented 1 year ago

下記の関数で作成した userdic.csv を利用して、特定の固有名詞を抽出することを想定しています。

def generate_userdic_janome(words):
    userdic = []
    for word in words:
        entry = f"{word},1288,1288,-100000,名詞,固有名詞,一般,*,*,*,{word},{word},{word}"
        userdic.append(entry.split(","))
    df = pd.DataFrame(userdic)
    df.to_csv("userdic.csv", header=False, index=False, encoding="utf-8-sig")
    print("generate userdic.csv")

作成した辞書はこちらです。

クラウド,1288,1288,-100000,名詞,固有名詞,一般,*,*,*,クラウド,クラウド,クラウド

このとき、生成した辞書を使って

t = Tokenizer("userdic.csv", udic_enc="utf8")
for token in t.tokenize('クラウド利用のお客様'):
  print(token)

を実行すると

クラ  名詞,固有名詞,一般,*,*,*,クラ,クラ,クラ
ウド  名詞,一般,*,*,*,*,ウド,ウド,ウド
利用  名詞,サ変接続,*,*,*,*,利用,リヨウ,リヨー
の   助詞,連体化,*,*,*,*,の,ノ,ノ
お客様 名詞,一般,*,*,*,*,お客様,オキャクサマ,オキャクサマ

という結果となり クラウド が期待通り抽出されませんでした。 こちらはプログラム上に問題があるのか、コストの設定等に問題があるのかご指摘いただければ幸いです。

mocobeta commented 1 year ago

手元で試しましたが,期待通りに動くようです.

$ cat userdic.csv 
クラウド,1288,1288,-100000,名詞,固有名詞,一般,*,*,*,クラウド,クラウド,クラウド
$ cat test_userdic.py 
from janome.tokenizer import Tokenizer

t = Tokenizer("userdic.csv", udic_enc="utf8")
for token in t.tokenize('クラウド利用のお客様'):
    print(token)
$ python test_userdic.py 
クラウド    名詞,固有名詞,一般,*,*,*,クラウド,クラウド,クラウド
利用  名詞,サ変接続,*,*,*,*,利用,リヨウ,リヨー
の   助詞,連体化,*,*,*,*,の,ノ,ノ
お客様 名詞,一般,*,*,*,*,お客様,オキャクサマ,オキャクサマ

原因は測りかねますが,ユーザ辞書ファイルのエンコーディングなどは正しいでしょうか?

epersona commented 1 year ago

ご確認ありがとうございます。 ご指摘の通り辞書ファイルの出力時のエンコーディングに関係していました。 pandasを利用して辞書ファイルCSVファイルを出力する際に utf-8-sig のオプションを利用しています。 これはファイル先頭にBOMを付与して、Excel等でファイルを開いた際に日本語が文字化けしなくなるための配慮でした。 そのため、Tokernizerを呼び出す際の引数として以下のように utf-8-sig を与えることで問題が解決できることを確認しました。

t = Tokenizer("userdic.csv", udic_enc="utf-8-sig")