●環境
・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
回答1件
あなたの回答
tips
プレビュー