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

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

ただいまの
回答率

87.50%

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 13K+

score 19

●環境
・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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • can110

    2017/08/17 15:56

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

    キャンセル

  • okuya

    2017/08/20 22:08

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

    キャンセル

回答 1

checkベストアンサー

+3

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

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

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

import MeCab as mc
t = mc.Tagger('-Ochasen') 
sentence = "今日は朝から良い天気ですが、夕方から雨が降りそう。外出時は、傘を忘れないようにね。"  #(41文字)
sentence = sentence.replace('\n', ' ')
print(sentence)

# python3 + mecabでnode.surfaceが取得できないバグへの対応
# http://qiita.com/piruty_joy/items/ce218090eae53b775b79
t.parse('')
node = t.parseToNode(sentence)
while(node):
    print('node surface[%s] feature[%s]' %(node.surface, node.feature))
    if node.surface != "":  # ヘッダとフッタを除外 
        print(node.surface, '/t', node.feature)
    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 17:58

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

    キャンセル

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

  • ただいまの回答率 87.50%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る