質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Mecab

Mecabは、オープンソースの形態素解析エンジンです。 言語、辞書、コーパスに依存しない汎用的な設計を基本方針としています。 Mecabの由来は、開発者の好物である和布蕪(めかぶ)から名づけられました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

自然言語処理

自然言語処理は、日常的に使用される自然言語をコンピューターに処理させる技術やソフトウェアの総称です。

Q&A

0回答

1024閲覧

pythonでMeCab、neologdで形態素解析すると結果が文字化け(ユニコードエスケープ)する

matsu1985

総合スコア0

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Mecab

Mecabは、オープンソースの形態素解析エンジンです。 言語、辞書、コーパスに依存しない汎用的な設計を基本方針としています。 Mecabの由来は、開発者の好物である和布蕪(めかぶ)から名づけられました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

自然言語処理

自然言語処理は、日常的に使用される自然言語をコンピューターに処理させる技術やソフトウェアの総称です。

0グッド

0クリップ

投稿2020/09/14 17:15

編集2020/09/15 07:35

前提・実現したいこと

初めまして。表題の通り、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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

quickquip

2020/09/15 01:23

雰囲気的には辞書の問題な感じはします。NEogold のバージョンがあるといいかと思います。
matsu1985

2020/09/15 02:46

ありがとうございます。追記いたしましたが、これで合っているでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問