前提・実現したいこと
初めまして。表題の通り、PythonにてMeCab、NEogold辞書で形態素解析をしたいのですが、結果が上手く出せません。
環境:Windows10 64bit、Anaconda3、jupyter notebook
※辞書はコード中のフォルダにインストールしてあります。
試したこと
以下のコードは実行すると正しく結果が出力されているように見えます。
import MeCab # ipadic tagger = MeCab.Tagger('-d C:\ProgramData\Mecab\dic\ipadic') result = tagger.parse("すもももももももものうち") print(result)
↓出力結果
すもも 名詞,一般,,,,,すもも,スモモ,スモモ
も 助詞,係助詞,,,,,も,モ,モ
もも 名詞,一般,,,,,もも,モモ,モモ
も 助詞,係助詞,,,,,も,モ,モ
もも 名詞,一般,,,,,もも,モモ,モモ
の 助詞,連体化,,,,,の,ノ,ノ
うち 名詞,非自立,副詞可能,,,*,うち,ウチ,ウチ
EOS
# neologd tagger = MeCab.Tagger('-d C:\ProgramData\Mecab\dic\ipadic-neologd') result = tagger.parse("すもももももももものうち") print(result)
↓出力結果
すもももももももものうち 名詞,固有名詞,一般,,,*,すもももももももものうち,スモモモモモモモモノウチ,スモモモモモモモモノウチ
EOS
しかし、以下を実行するとしばらくしてから(なぜか時間がかかる)エラーになります。
# neologd tagger = MeCab.Tagger('-d C:\ProgramData\Mecab\dic\ipadic-neologd') result = tagger.parse("JO") print(result)
エラー発生
Exception in callback BaseAsyncIOLoop._handle_events(928, 1) handle: <Handle BaseAsyncIOLoop._handle_events(928, 1)> Traceback (most recent call last): File "C:...\Anaconda3\lib\asyncio\events.py", line 88, in _run self._context.run(self._callback, *self._args) File "C:...\Anaconda3\lib\site-packages\tornado\platform\asyncio.py", line 143, in _handle_events handler_func(fileobj, events) File "C:...\Anaconda3\lib\site-packages\zmq\eventloop\zmqstream.py", line 456, in _handle_events self._handle_recv() File "C:...\Anaconda3\lib\site-packages\zmq\eventloop\zmqstream.py", line 486, in _handle_recv self._run_callback(callback, msg) File "C:...\Anaconda3\lib\site-packages\zmq\eventloop\zmqstream.py", line 438, in _run_callback callback(*args, **kwargs) File "C:...\Anaconda3\lib\site-packages\ipykernel\iostream.py", line 120, in _handle_event event_f() File "C:...\Anaconda3\lib\site-packages\ipykernel\iostream.py", line 382, in _flush parent=self.parent_header, ident=self.topic) File "C:...\Anaconda3\lib\site-packages\jupyter_client\session.py", line 737, in send to_send = self.serialize(msg, ident) File "C:...\Anaconda3\lib\site-packages\jupyter_client\session.py", line 625, in serialize content = self.pack(content) File "C:...\Anaconda3\lib\site-packages\jupyter_client\session.py", line 103, in <lambda> ensure_ascii=False, allow_nan=False, File "C:...\Anaconda3\lib\site-packages\zmq\utils\jsonapi.py", line 43, in dumps s = s.encode('utf8') UnicodeEncodeError: 'utf-8' codec can't encode characters in position 310-311: surrogates not allowed
また、以下のように書き換えると、結果がエスケープ文字列で表示されます。
node = tagger.parseToNode("JO") word = node.surface # 分解された単語部分 wclass = node.feature.split(',') # 単語の説明部分(カンマで区切ってリスト化) # 先頭を飛ばして次へ node = node.next word = node.surface # 分解された単語部分 wclass = node.feature.split(',') # 単語の説明部分(カンマで区切ってリスト化) print(word) print(wclass)
↓出力結果
JO
['̾\udcbb\udcec', '\udcb8\udcc7ͭ̾\udcbb\udcec', '\udcc1ȿ\udca5', '', '', '', '']
このような環境で、Twitterのタイムラインを形態素解析しているですが、このようなエスケープ文字列の単語として識別される単語がいくつも出てきてしまい、正しいのかよくわからない状況です。
これは、辞書のインストール・作成の仕方に問題があるのでしょうか?
あるいは、文字列のエンコードの問題、その他の問題などでしょうか?
分かる方いましたら、ご教授いただきたいです。
ちなみに、コマンドプロンプトでPythonを起動して実行すると以下のような結果になります。
>>> tagger = MeCab.Tagger('-d C:\ProgramData\Mecab\dic\ipadic-neologd') >>> result = tagger.parse("JO") >>> print(result) JO ̾��,��ͭ̾��,�ȿ�,*,*,*,* EOS
以上、よろしくお願いいたします。
補足情報(FW/ツールのバージョンなど)
追記
import MeCab tagger = MeCab.Tagger('-d C:\ProgramData\Mecab\dic\ipadic-neologd') info = tagger.dictionary_info() print('neologd') print(info.charset) print(info.version) print('ipadic') tagger = MeCab.Tagger('-d C:\ProgramData\Mecab\dic\ipadic') info = tagger.dictionary_info() print(info.charset) print(info.version)
↓出力結果
neologd
-utf-8
102
ipadic
UTF-8
102
使ったコミット
https://github.com/neologd/mecab-ipadic-neologd/commit/45315fdad28456d3e98d5b36bea46a8010235cac
あなたの回答
tips
プレビュー