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

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

ただいまの
回答率

89.63%

MecabでUnicode Decode Errorを解決したい

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 993

moviethief319

score 12

 前提・実現したいこと

ある参考書に載っていた
natto -Mecabを用いたword2vecを実行しようとしましたがこのエラーだけはよくわからなかったので質問させていただきます
UnicodeDecodeError MecabErrorがよくわかりません

 発生している問題・エラーメッセージ

UnicodeDecodeError                        Traceback (most recent call last)
~\Anaconda3\Lib\site-packages\natto\mecab.py in __parse_tonodes(self, text, **kwargs)
    396                                 nptr.surface[0:nptr.length])
--> 397                             surf = self.__bytes2str(raws).strip()
    398 

~\Anaconda3\Lib\site-packages\natto\support.py in bytes2str(b)
     25             '''Transforms bytes into string (Unicode).'''
---> 26             return b.decode(py3enc)
     27         def str2bytes(u):

UnicodeDecodeError: 'shift_jis' codec can't decode byte 0x81 in position 0: incomplete multibyte sequence

During handling of the above exception, another exception occurred:

MeCabError                                Traceback (most recent call last)
<ipython-input-14-eb2fa4a116ee> in <module>()
     64 
     65 if __name__ == '__main__':
---> 66     tf.app.run()

~\Anaconda3\envs\tensorflow\lib\site-packages\tensorflow\python\platform\app.py in run(main, argv)
    124   # Call the main function, passing through any arguments
    125   # to the final program.
--> 126   _sys.exit(main(argv))
    127 
    128 

<ipython-input-14-eb2fa4a116ee> in main(argv)
     13 
     14 def main(argv):
---> 15     data=DataSet(FLAGS.data_dir,FLAGS.max_vocab)
     16 
     17 

~\Desktop\TensorFlowDL-samples-master\word2vec\data_set.py in __init__(self, data_dir, max_vocab)
     23         documents = [self._preprocessing(document) for document in row_documents]
     24         #形態素解析
---> 25         splited_documents = [self._morphological(document) for document in documents]
     26 
     27         words = []

~\Desktop\TensorFlowDL-samples-master\word2vec\data_set.py in <listcomp>(.0)
     23         documents = [self._preprocessing(document) for document in row_documents]
     24         #形態素解析
---> 25         splited_documents = [self._morphological(document) for document in documents]
     26 
     27         words = []

~\Desktop\TensorFlowDL-samples-master\word2vec\data_set.py in _morphological(self, document)
     78         #MeCabの形態素解析結果のフォーマット
     79         with MeCab('-F%f[0],%f[1],%f[6]') as mcb:
---> 80             for token in mcb.parse(document, as_nodes=True):
     81                 features = token.feature.split(',')
     82                 #名詞(一般)動詞(自立)、形容詞(自立)以外は除外

~\Anaconda3\Lib\site-packages\natto\mecab.py in __parse_tonodes(self, text, **kwargs)
    425             err = self.__mecab.mecab_lattice_strerror(self.lattice)
    426             logger.error(self.__bytes2str(self.__ffi.string(err)))
--> 427             raise MeCabError(self.__bytes2str(self.__ffi.string(err)))
    428 
    429     def __repr__(self):





def _read_docment(self,file_path):
    with open(file_path,'r',encoding='sjis')as f :


def _morphological(self,document):
    word_list=[]
    with MeCab('-F%f[0],%f[1],%f[6]')as mcb:
        for token in mcb.parse(document,as_nodes=True):
            features=token.feature.splits(',')

            if features[0]=='名詞'and features[1]=='一般'and features[2] !='':
                word_list.append(features[2])

            if features[0]=='動詞'and features[1]=='自立'and features[2] !='':
                word_list.append(features[2])

            if features[0]=='形容詞'and features[1]=='自立'and features[2] !='':
                word_list.append(features[2])

    return word_list


class DataSet(object):
    def __init__(self,data_dir,max_vocab):
        file_pathes=[]
        for file_path in glob.glob(data_dir+'*'):
            file_pathes.append(file_path)

        row_documents=[self._read_document(file_path)for file_path in file_pathes]
        documents=[self._preprocessing(document)for document in row_documents]
        splited_documents=[self._morphological(document)for document in documents]

        word=[]
        for word_list in splited_documents:
            words.extend(word_list)

        self.id_sequence,self.word_frequency,self.w_to_id,self.id_to_w=self._build_data_sets(words,max_vocab)
        print('Most common words (+UNK)',self.word_frequency[:5])
        print ('Sample data.')
        print (self.id_sequence[:10])
        print([self.id_to_w[i]for i in self.id_sequence[:10]])
        self.data_index=0

from data_set import *
def create_next_batch(self,batch_size,num_skips,skip_window):
    assert batch_size% num_skips==0
    assert num_skips<=2*skip_window
    inputs=np.ndarray(shape=(batch_size),dtype=np.int32)
    labels=np.ndarray(shape=(batch_size,1),dtype=np.int32)
    span=2*skip_window+1
    buffer=collections.deque(maxlen=span)

    if self.data_index+span>len(self.id_sequence):
         self.data_index=0

    buffer.extend(self.id_sequence[self.data_index:self.data_index+span])
    self.data_index +=span

    for i in range(batch_size//num_skips):
        target=skip_window
        targets_to_avoid=[skip_window]
        for j in range(num_skips):

            while target in targets_to_avoid:
                target=random.randint(0,span-1)
            targets_to_avoid.append(target)
            inputs[i*num_skips+j]=buffer[skip_window]
            inputs[i*num_skips+j,0]=buffer[target]

        if self.data_index==len(self.id_sequence):
            buffer=self.id_sequence[:span]
            self.data_index=span

        else:
            buffer.append(self.id_sequence[self.data_index])
            self.data_index+=1

    self.data_index=(self.data_index+len(self.id_sequence)-span)%len(self.id_sequence)

    return inputs,labels
FLAGS=tf.app.flags.FLAGS
tf.app.flags.DEFINE_string('data_dir','data/',"Data set directory")#インプット
tf.app.flags.DEFINE_string('log_dir','log/',"Log directory")
tf.app.flags.DEFINE_integer('max_vocab',2000,"Max Vocablary size.")
tf.app.flags.DEFINE_integer('skip_window',2,"How many words to consider left and right")
tf.app.flags.DEFINE_integer('num_skips',4,"How many times to reuse an input to generate a label")
tf.app.flags.DEFINE_integer('embedding_size',64,"Dimention of the embedding vector")
tf.app.flags.DEFINE_integer('num_sumpled',64,"Number of negative examples to sample")
tf.app.flags.DEFINE_integer('num_step',10000,"Train steps")
tf.app.flags.DEFINE_integer('batch_size',64,"Batch size")
tf.app.flags.DEFINE_float('learning_rate',0.1,"learning rate")
tf.app.flags.DEFINE_bool('create_tsv',True,"Create words.tsv or not")

def main(argv):
    data=DataSet(FLAGS.data_dir,FLAGS.max_vocab)


    batch_size=FLAGS.batch_size
    embedding_size=FLAGS.embedding_size
    vocab_size=len(data.w_to_id)
    inputs=tf.placeholder(tf.int32,shape=[batch_size])
    correct=tf.placeholder(tf.int32,shape=[batch_size,1])

    word_embedding=tf.Variable(tf.random_uniform([vocab_size,embedding_size],-1.0,1.0),name='word_embedding')
    embed=tf.nn.embedding_lookup(word_embedding,inputs)

    w_out=tf.Variable(tf.truncated_normal([vocab_size,embedding_size],stddev=1.0/math.sqrt(embedding_size)))
    b_out=tf.Variable(tf.zeros([vocab_size]))
    nce_loss=tf.nn.nce_loss(weights=w_out,biases=b_out,labels=correct,inputs=embed,num_sampled=FLAGS.num_sumpled,num_classes=vocab_size)
    loss=tf.reduce_mean(nce_loss)

    global_step=tf.Variable(0,name='global_step',trainable=False)
    train_op=tf.train.GradientDescentOptimizer(FLAGS.learning_rate).minimize(loss,global_step=global_step)

    init=tf.global_variables_initializer()
    saver=tf.train.Saver(max_to_keep=3)

    with tf.Session()as sess:
        ckpt_state=tf.train.get_checkpoint_state(FLAGS.log_dir)
        if ckpt_state:
            last_model=ckpt_state.model_checkpoint_path
            saver.restore(sess,last_model)
            print("model was loaded",last_model)

        else:
            sess.run(init)
            print("Initialized")

        last_step=sess.run(global_step)
        average_loss=0
        for i in range(FLAGS.num_step):
            step=last_step+i+1
            batch_inputs,batch_labels=data.create_next_batch(batch_size,FLAGS.num_skips,FLAGS.skip_window)
            feed_dict={inputs:batch_inputs,correct:batch_labels}

            _,loss_val=sess.run([train_op,loss],feed_dict=feed_dict)
            average_loss+=loss_val

            if step%100==0:
                average_loss/=100
                print('Average loss at step',step,':',average_loss)
                average_loss=0
                saver.save(sess,FLAGS.log_dir+'my_model.ckpt',step)

if __name__ == '__main__':
    tf.app.run()

ここにより詳細な情報を記載してください。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

+3

UnicodeDecodeError: 'shift_jis' codec can't decode byte 0x81 in position 0: incomplete multibyte sequence

データをSHIFT-JISで読み込んでいますが、あっていますか?


見たところ、「形態素解析」のところで詰まっています。
データを読み込んで、
正しく読み込んだことを確認して、
解析しようとして、

みたく段階的に検証してみてください。

また別ファイルを作って、関係のない部分を削除してください。

情報が多すぎて対応箇所を見つけるのが大変です。

それと、最小限実行可能なデータを用意できるのであれば推測だけでなく検証ができます。

特に文字コードのバグの場合検証が難しく、どうしてもSHIFT-JISでやっていかなければならないとしてもUnicodeで先に検証して、他の箇所にバグがないことを確かめてから挑戦してみてください。

表示が同じでも内部表現が異なるので、確かめるのが一苦労です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

+2

mecabは文字コードにうるさいので、チェックしたほうが良さそうなことがあげておきます。
1.テキストファイルを生のmecabに入力して正常終了するか
2.テキストファイルをpythonで読み込んだ結果の文字コードは何か。また、それをmecabに直接入力して正常終了するか
3.読み込んだテキストファイルを加工する際、文字コードが変更していないか

mecabのなかでdecodeのエラーを起こしている感じなので、mecabが処理できる文字コードにしてから処理するようにコードを修正すればいいはずです

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/22 19:35

    MeCabで読み込めましたありがとうございます

    キャンセル

  • 2018/03/22 19:39 編集

    調べてもよくわからないエラーが出ました
    どうかエラーコードの意味を教えてくれると嬉しいです
    フォルダ内の一つ目のtxtファイルだけを読み込んで形態素解析しており、
    二つめ以降のファイルは処理されていないようです


    An exception has occurred, use %tb to see the full traceback.

    SystemExit


    C:\Users\xxx\Anaconda3\envs\tensorflow\lib\site-packages\IPython\core\interactiveshell.py:2918: UserWarning: To exit: use 'exit', 'quit', or Ctrl-D.
    warn("To exit: use 'exit', 'quit', or Ctrl-D.", stacklevel=1)

    キャンセル

  • 2018/03/22 20:13

    ちょっとわからないです。ログがこれだけだとすると、python側のエラーではないのかもしれません。
    別途、質問されたほうがいいと思います

    キャンセル

  • 2018/03/22 22:48

    ありがとうございます
    いろいろ試してみてダメだったら別途質問します。

    キャンセル

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

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

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