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

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

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

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

Python

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

Q&A

解決済

1回答

3024閲覧

pythonでMecabを利用した語彙解析がうまくできない。

okuya

総合スコア19

Mecab

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

Python

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

0グッド

0クリップ

投稿2017/08/17 06:11

●環境
・Windows Edition:Windows 7 Professional Service Pack 1
・pythonバージョン:Python 3.6.2 (v3.6.2:5fd33b5, Jul 8 2017, 04:57:36) [MSC v.1900 64 bit (AMD64)] on win32
●現象
①ユニコード文字列を utf-8 にエンコードして parseToNode に渡すとTypeErrorが発生する。(テストコード1)
②そこで、ユニコードでない文字列を渡すとTypeErrorは発生しないが、surface を取得しようとすると UnicodeDecodeError が発生する。(テストコード2)
③しかし、34文字以下のユニコードでない文字列ならTypeErrorもUnicodeDecodeErrorも発生しないが、最初の語彙のsurfaceが正常に取得できない。(テストコード3)

35文字以上の文書語の彙解析をしたいのですが、上記3つの問題を解決するにはどうすれば良いかご教示頂けないでしょうか。

●テストコード1(test1.py)
ユニコード文字列を utf-8 にエンコードして parseToNode に渡すとTypeErrorが発生する。

1 import MeCab as mc
2 t = mc.Tagger('-Ochasen')
3 sentence = u"今日は朝から良い天気ですが、夕方から雨が降りそう。外出時は、傘を忘れないようにね"
4 print(sentence)
5 sentence = sentence.replace('\n', ' ')
6 text = sentence.encode('utf-8')
7 print(text.decode('utf-8'))
8 node = t.parseToNode(text)
9 print(node)
10 while(node):
11 if node.surface != "": # ヘッダとフッタを除外
12 print(node.surface, '/t', node.feature)
13 node = node.next
14 print(node)
15 if node is None:
16 break

python test1.py

今日は朝から良い天気ですが、夕方から雨が降りそう。外出時は、傘を忘れないようにね
今日は朝から良い天気ですが、夕方から雨が降りそう。外出時は、傘を忘れないようにね
Traceback (most recent call last):
File "test1.py", line 8, in <module>
node = t.parseToNode(text)
File "C:\Program Files\Python\Python36\lib\site-packages\MeCab.py", line 282,
in parseToNode
def parseToNode(self, *args): return _MeCab.Tagger_parseToNode(self, *args)
TypeError: in method 'Tagger_parseToNode', argument 2 of type 'char const *'\\

--
●テストコード2(test2.py)
ユニコードでない文字列なら parseToNode はエラーとならないが、surface を取得しようとすると UnicodeDecodeError が発生する。

1 import MeCab as mc
2 t = mc.Tagger('-Ochasen')
3 sentence = "今日は朝から良い天気ですが、夕方から雨が降りそう。外出時は、傘を忘れないようにね。" #(41文字)
4 sentence = sentence.replace('\n', ' ')
5 print(sentence)
6 node = t.parseToNode(sentence)
7 print(node)
8 while(node):
9 if node.surface != "": # ヘッダとフッタを除外
10 print(node.surface, '/t', node.feature)
11 node = node.next
12 print(node)
13 if node is None:
14 break

python test2.py

今日は朝から良い天気ですが、夕方から雨が降りそう。外出時は、傘を忘れないようにね。
<MeCab.Node; proxy of <Swig Object of type 'MeCab::Node *' at 0x0000000001E67BA0> >
Traceback (most recent call last):
File "test2.py", line 9, in <module>
if node.surface != "": # ヘッダとフッタを除外
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe8 in position 1: invalid continuation byte

--
●テストコード3(test3.py)
34文字以下のユニコードでない文字列なら正常終了する。しかし、最初の語句(今日)のsurfaceが取得できない。
35文字以上はテストコード2と同じ現象となる。

3 sentence = "今日は朝から良い天気ですが、夕方から雨が降りそう。外出時は、傘を忘れ" #(34文字)

python test3.py

今日は朝から良い天気ですが、夕方から雨が降りそう。外出時は、傘を忘れ
<MeCab.Node; proxy of <Swig Object of type 'MeCab::Node ' at 0x00000000021C75A0> >
<MeCab.Node; proxy of <Swig Object of type 'MeCab::Node ' at 0x00000000021C7BA0> >
r /t 名詞,副詞可能,
,
,,,今日,キョウ,キョー ←「今日」でなく、なぜ「r」となる?
<MeCab.Node; proxy of <Swig Object of type 'MeCab::Node ' at 0x00000000021C75A0> >
は /t 助詞,係助詞,
,,,,は,ハ,ワ
<MeCab.Node; proxy of <Swig Object of type 'MeCab::Node ' at 0x00000000021C7BA0> >
朝 /t 名詞,副詞可能,
,
,,,朝,アサ,アサ
<MeCab.Node; proxy of <Swig Object of type 'MeCab::Node ' at 0x00000000021C75A0> >
から /t 助詞,格助詞,一般,
,,,から,カラ,カラ
<MeCab.Node; proxy of <Swig Object of type 'MeCab::Node ' at 0x00000000021C7BA0> >
良い /t 形容詞,自立,
,,形容詞・アウオ段,基本形,良い,ヨイ,ヨイ
<MeCab.Node; proxy of <Swig Object of type 'MeCab::Node ' at 0x00000000021C75A0> >
天気 /t 名詞,一般,
,
,,,天気,テンキ,テンキ
<MeCab.Node; proxy of <Swig Object of type 'MeCab::Node ' at 0x00000000021C7BA0> >
です /t 助動詞,
,,,特殊・デス,基本形,です,デス,デス
<MeCab.Node; proxy of <Swig Object of type 'MeCab::Node ' at 0x00000000021C75A0> >
が /t 助詞,接続助詞,
,,,,が,ガ,ガ
<MeCab.Node; proxy of <Swig Object of type 'MeCab::Node ' at 0x00000000021C7BA0> >
、 /t 記号,読点,
,
,,,、,、,、
<MeCab.Node; proxy of <Swig Object of type 'MeCab::Node ' at 0x00000000021C75A0> >
夕方 /t 名詞,副詞可能,
,,,,夕方,ユウガタ,ユーガタ
<MeCab.Node; proxy of <Swig Object of type 'MeCab::Node ' at 0x00000000021C7BA0> >
から /t 助詞,格助詞,一般,
,
,,から,カラ,カラ
<MeCab.Node; proxy of <Swig Object of type 'MeCab::Node ' at 0x00000000021C75A0> >
雨 /t 名詞,一般,
,
,,,雨,アメ,アメ
<MeCab.Node; proxy of <Swig Object of type 'MeCab::Node ' at 0x00000000021C7BA0> >
が /t 助詞,格助詞,一般,
,,,が,ガ,ガ
<MeCab.Node; proxy of <Swig Object of type 'MeCab::Node ' at 0x00000000021C75A0> >
降り /t 動詞,自立,
,,一段,連用形,降りる,オリ,オリ
<MeCab.Node; proxy of <Swig Object of type 'MeCab::Node ' at 0x00000000021C7BA0> >
そう /t 名詞,接尾,助動詞語幹,
,
,,そう,ソウ,ソー
<MeCab.Node; proxy of <Swig Object of type 'MeCab::Node ' at 0x00000000021C75A0> >
。 /t 記号,句点,
,
,,,。,。,。
<MeCab.Node; proxy of <Swig Object of type 'MeCab::Node ' at 0x00000000021C7BA0> >
外出 /t 名詞,サ変接続,
,,,,外出,ガイシュツ,ガイシュツ
<MeCab.Node; proxy of <Swig Object of type 'MeCab::Node ' at 0x00000000021C75A0> >
時 /t 名詞,接尾,副詞可能,
,
,,時,ジ,ジ
<MeCab.Node; proxy of <Swig Object of type 'MeCab::Node ' at 0x00000000021C7BA0> >
は /t 助詞,係助詞,
,
,,,は,ハ,ワ
<MeCab.Node; proxy of <Swig Object of type 'MeCab::Node ' at 0x00000000021C75A0> >
、 /t 記号,読点,
,,,,、,、,、
<MeCab.Node; proxy of <Swig Object of type 'MeCab::Node ' at 0x00000000021C7BA0> >
傘 /t 名詞,一般,
,
,,,傘,カサ,カサ
<MeCab.Node; proxy of <Swig Object of type 'MeCab::Node ' at 0x00000000021C75A0> >
を /t 助詞,格助詞,一般,
,,,を,ヲ,ヲ
<MeCab.Node; proxy of <Swig Object of type 'MeCab::Node ' at 0x00000000021C7BA0> >
忘れ /t 動詞,自立,
,*,一段,連用形,忘れる,ワスレ,ワスレ
<MeCab.Node; proxy of <Swig Object of type 'MeCab::Node *' at 0x00000000021C75A0> >
None

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

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

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

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

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

can110

2017/08/17 06:56

コードは行番号をつけずコード表示のまま提示されるとコピペしやすく助かります。行番号はテキストエディタで分かるので。
okuya

2017/08/20 13:08

承知しました。次回から気をつけます。ありがとうございます。
guest

回答1

0

ベストアンサー

テストコード1については、特に根拠はありませんが、mecab-python側がよろしく文字コード変換してくれると思うので、そのままstr型(UNICODE)のまま渡してよいと思います。(encode/decode不要)

テストケース2については、mecab側のバグが原因のようです。
python3 + mecabでnode.surfaceが取得できないバグへの対応

下記のようなテストコードにて、t.parse('')を実行することで正常に表示されました。

Python

1import MeCab as mc 2t = mc.Tagger('-Ochasen') 3sentence = "今日は朝から良い天気ですが、夕方から雨が降りそう。外出時は、傘を忘れないようにね。" #(41文字) 4sentence = sentence.replace('\n', ' ') 5print(sentence) 6 7# python3 + mecabでnode.surfaceが取得できないバグへの対応 8# http://qiita.com/piruty_joy/items/ce218090eae53b775b79 9t.parse('') 10node = t.parseToNode(sentence) 11while(node): 12 print('node surface[%s] feature[%s]' %(node.surface, node.feature)) 13 if node.surface != "": # ヘッダとフッタを除外 14 print(node.surface, '/t', node.feature) 15 node = node.next
今日は朝から良い天気ですが、夕方から雨が降りそう。外出時は、傘を忘れないようにね。 node surface[] feature[BOS/EOS,*,*,*,*,*,*,*,*] node surface[今日] feature[名詞,副詞可能,*,*,*,*,今日,キョウ,キョー] 今日 /t 名詞,副詞可能,*,*,*,*,今日,キョウ,キョー node surface[は] feature[助詞,係助詞,*,*,*,*,は,ハ,ワ] は /t 助詞,係助詞,*,*,*,*,は,ハ,ワ node surface[朝] feature[名詞,副詞可能,*,*,*,*,朝,アサ,アサ] 朝 /t 名詞,副詞可能,*,*,*,*,朝,アサ,アサ node surface[から] feature[助詞,格助詞,一般,*,*,*,から,カラ,カラ] から /t 助詞,格助詞,一般,*,*,*,から,カラ,カラ node surface[良い] feature[形容詞,自立,*,*,形容詞・アウオ段,基本形,良い,ヨイ,ヨイ] 良い /t 形容詞,自立,*,*,形容詞・アウオ段,基本形,良い,ヨイ,ヨイ node surface[天気] feature[名詞,一般,*,*,*,*,天気,テンキ,テンキ] 天気 /t 名詞,一般,*,*,*,*,天気,テンキ,テンキ node surface[です] feature[助動詞,*,*,*,特殊・デス,基本形,です,デス,デス] です /t 助動詞,*,*,*,特殊・デス,基本形,です,デス,デス node surface[が] feature[助詞,接続助詞,*,*,*,*,が,ガ,ガ] が /t 助詞,接続助詞,*,*,*,*,が,ガ,ガ node surface[、] feature[記号,読点,*,*,*,*,、,、,、] 、 /t 記号,読点,*,*,*,*,、,、,、 node surface[夕方] feature[名詞,副詞可能,*,*,*,*,夕方,ユウガタ,ユーガタ] 夕方 /t 名詞,副詞可能,*,*,*,*,夕方,ユウガタ,ユーガタ node surface[から] feature[助詞,格助詞,一般,*,*,*,から,カラ,カラ] から /t 助詞,格助詞,一般,*,*,*,から,カラ,カラ node surface[雨] feature[名詞,一般,*,*,*,*,雨,アメ,アメ] 雨 /t 名詞,一般,*,*,*,*,雨,アメ,アメ node surface[が] feature[助詞,格助詞,一般,*,*,*,が,ガ,ガ] が /t 助詞,格助詞,一般,*,*,*,が,ガ,ガ node surface[降り] feature[動詞,自立,*,*,一段,連用形,降りる,オリ,オリ] 降り /t 動詞,自立,*,*,一段,連用形,降りる,オリ,オリ node surface[そう] feature[名詞,接尾,助動詞語幹,*,*,*,そう,ソウ,ソー] そう /t 名詞,接尾,助動詞語幹,*,*,*,そう,ソウ,ソー node surface[。] feature[記号,句点,*,*,*,*,。,。,。] 。 /t 記号,句点,*,*,*,*,。,。,。 node surface[外出] feature[名詞,サ変接続,*,*,*,*,外出,ガイシュツ,ガイシュツ] 外出 /t 名詞,サ変接続,*,*,*,*,外出,ガイシュツ,ガイシュツ node surface[時] feature[名詞,接尾,副詞可能,*,*,*,時,ジ,ジ] 時 /t 名詞,接尾,副詞可能,*,*,*,時,ジ,ジ node surface[は] feature[助詞,係助詞,*,*,*,*,は,ハ,ワ] は /t 助詞,係助詞,*,*,*,*,は,ハ,ワ node surface[、] feature[記号,読点,*,*,*,*,、,、,、] 、 /t 記号,読点,*,*,*,*,、,、,、 node surface[傘] feature[名詞,一般,*,*,*,*,傘,カサ,カサ] 傘 /t 名詞,一般,*,*,*,*,傘,カサ,カサ node surface[を] feature[助詞,格助詞,一般,*,*,*,を,ヲ,ヲ] を /t 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ node surface[忘れ] feature[動詞,自立,*,*,一段,未然形,忘れる,ワスレ,ワスレ] 忘れ /t 動詞,自立,*,*,一段,未然形,忘れる,ワスレ,ワスレ node surface[ない] feature[助動詞,*,*,*,特殊・ナイ,基本形,ない,ナイ,ナイ] ない /t 助動詞,*,*,*,特殊・ナイ,基本形,ない,ナイ,ナイ node surface[よう] feature[名詞,非自立,助動詞語幹,*,*,*,よう,ヨウ,ヨー] よう /t 名詞,非自立,助動詞語幹,*,*,*,よう,ヨウ,ヨー node surface[に] feature[助詞,副詞化,*,*,*,*,に,ニ,ニ] に /t 助詞,副詞化,*,*,*,*,に,ニ,ニ node surface[ね] feature[助詞,終助詞,*,*,*,*,ね,ネ,ネ] ね /t 助詞,終助詞,*,*,*,*,ね,ネ,ネ node surface[。] feature[記号,句点,*,*,*,*,。,。,。] 。 /t 記号,句点,*,*,*,*,。,。,。 node surface[] feature[BOS/EOS,*,*,*,*,*,*,*,*]

投稿2017/08/17 06:54

can110

総合スコア38256

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

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

okuya

2017/08/17 08:58

ありがとうございます。 解決しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問