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

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

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

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

3104閲覧

MeCabで形態素解析をしたい。UnicodeDecodeError を解消したい

giro1975

総合スコア37

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2018/09/23 00:06

編集2018/09/23 00:08

環境
windows10
コマンドライン
Python 3.6.5

import sys import os from glob import glob from collections import Counter import MeCab def main(): """ コマンドライン引数で指定したディレクトリ内のファイルを読み込んで、頻出単語を表示する """ input_dir = sys.argv[1] #コマンドラインの第1引数で、WikiExtractorの出力先のディレクトリを指定する。 tagger = MeCab.Tagger('') tagger.parse('') #parseToNode()の不具合を回避するために必要。 # 単語の頻度を格納するCounterオブジェクトを作成する。 # Counterクラスはdictを継承しており、値としてキーの出現回数を保持する。 frequency = Counter() count_proccessed = 0 #glob()でワイルドカードにマッチするファイルのリストを取得し、マッチしたすべてのファイルを処理する。 for path in glob(os.path.join(input_dir,'*','wiki_*')): print('Processing{0}...'.format(path), file=sys.stderr) with open(path) as file: #ファイルを開く for content in iter_docs(file): #ファイル内の全記事について反復処理する。 tokens = get_tokens(tagger,content) #ページから名刺のリストを取得する。 # Counterのupdate()メソッドにリストなどの反復可能オブジェクトを指定すると、 # リストに含まれる値の出現回数を一度に増やせる。 frequency.update(tokens) # 10,000件ごとに進捗を表示。 count_proccessed += 1 if count_proccessed % 10000 == 0: print('{0}documents were processed.'.format(count_proccessed),file=sys.stderr) # 全記事の処理が完了したら、上位30件の名刺と出現回数を表示する。 for token, count in frequency.most_common(30): print(token,count) def iter_docs(file): """ ファイルオブジェクトを読み込んで、記事の中身(開始タグ<doc ...>と終了タグ</doc>の間のテキスト)を順に返すジェネレーター関数。 """ for line in file: if line.startswith('<doc '): buffer = [] #開始タグが見つかったらバッファを初期化する。 elif line.startswith('</doc>'): # 終了タグを見つかったらバッファの中身を結合してyieldする。 content = ''.join(buffer) yield content else: buffer.append(line) #開始タグ・終了タグ以外の行はバッファに追加する。 def get_tokens(tagger,content): """ 文書内に出現した名刺のリストを取得する関数。 """ tokens = [] #この記事で出現した名刺を格納するリスト。 node = tagger.parseToNode(content) while node: # node.featureはカンマで区切られた文字列なので、split()で分割して # 最初の2項目をcategoryとsub_categoryに代入する。 category,sub_category = node.feature.split(',')[:2] #固定名刺または一般名詞の場合のみtokensに追加する。 if category == '名刺' and sub_category in ('固有名詞','一般'): tokens.append(node.surface) node = node.next return tokes if __name__ == '__main__': main()

これをコマンドラインで

python word_frequency.py articles

と処理してarticles の形態素解析(頻出単語を抜き出す)を行いたいです。

しかし
UnicodeDecodeError: 'cp932' codec can't decode byte 0x89 in position 80: illegal multibyte sequence

とエラー終了してしまいます。
articles

https://dumps.wikimedia.org/jawiki/latest/jawiki-latest-pages-articles1.xml-p1p106175.bz2からダウンロードしたものをコマンドラインにて

python WikiExtractor.py --no-templates -o articles -b 100M jawiki-latest-pages-articles1.xml-p1p106175.bz2 ``` で処理して生成したものです。 ※[WikiExtractor.py](https://github.com/attardi/wikiextractor)からダウンロードした、Wikipediaのデータセットから文章を抜き出すためのスクリプトになります。 UnicodeDecodeErrorを解消したいです。よろしくお願いします。

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

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

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

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

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

quickquip

2018/09/23 06:39 編集

バックトレースが載せられていないので一般的な回答以外できない状態なのだと思います。
giro1975

2018/09/23 07:19

ありがとうございます。今回バックトレースだと思われるものがとても長かったで、末尾のエラーコードだけ記入しました。次回からバックトレースも記入できるように努力します。ありがとうございます。
guest

回答1

0

ベストアンサー

UnicodeDecodeError は大抵文字コードの誤りが原因です。今回、UnicodeDecodeError: 'cp932' codec can't decode と出ているので、ファイルを CP932 で開いたが、CP932 では存在しない文字が出てきてエラーになったようです。

ファイルを開くときには文字コードを指定してあげてください。おそらく UTF-8 か何かだと思いますが、その場合は以下のように指定します。

python

1 with open(path, encoding='utf-8') as file: #ファイルを開く 2 for content in iter_docs(file): #ファイル内の全記事について反復処理する。

encoding='utf-8' の部分です。

文字コードは日本語(マルチバイト言語)を扱う我々には避けて通れない問題です。明示的に指定する習慣を付けておくとトラブルが防げるので、ぜひ意識してみてください。

投稿2018/09/23 00:56

miyahan

総合スコア3095

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

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

giro1975

2018/09/23 07:20

ありがとうございます。出来ました! 明示的に指定する習慣を意識していきます。 これからもよろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問