自然言語処理をやろう!
と思ったとき、プログラムはいろんなものを参照しながらやっとできたものの
テキストを開いたりするときにエラーが書かれて先へ進めず…。
プログラミング初心者…、訳も分からず調べたら文字コードの問題だったらしいので
解決策としてまず最初に出会ったのが、テキストを開くとき文字コードを指定するというもの。
エディタで調べてみると、「shift_jis」で書かれているようなので
じゃぁ、まずはそれをやってみようかな。
##文字コードを指定してテキストを開く
始めのこの部分を
f = open(uencode.txt)
次のように変更
import codecs
f= codecs.open(unencode.txt, 'r', 'shift_jis')
わーい、読み込めた!と思ったら今度は自然言語処理で書いていたプログラムはUTF8を求めていたようで、他の所でエラーが出てしまった…。
なら、テキストで書かれている文字コードをUTF8に変えたものを作ってしまおう。
##文字コードを変換してテキストを保存
今回はたくさんのテキストを変換したかったので、一つのファイルにまとめてそのファイルに入っているすべてのものを変換します。
# -*- coding:utf-8 -*-
import codecs
import os
path=os.getcwd()
encode_path = os.path.join(path, 'encode')#変換後のファイルを保存するパス
unencode_path=os.path.join(path, 'unencode')#変換前のファイルが存在するパス
for name in sorted(os.listdir(unencode_path)):
f = open(os.path.join(unencode_path,name))
# 変換前(Shift_JIS) ファイルのパス
shiftjis_path = os.path.join(unencode_path,name)
#変換後(UTF8)ファイルのパスが無かったら作る
if not os.path.exists(encode_path):
os.makedirs(encode_path)
utf8_path = os.path.join(encode_path,name)
# 文字コードを utf-8 に変換して保存
f = codecs.open(shiftjis_path, "r", "shift_jis")
f_utf = codecs.open(utf8_path, "w", "utf-8")
for row in f:
f_utf.write(row)
f.close()
f_utf.close()
これでやっと自然言語処理のプログラムが通るようになった('ω')
###おまけ~文字コード~
今回shift_jisとutf-8しか使わなかったけれど、他の文字コードもプログラム内ではどう指定できるのか少し調べてみました。
文字コード | プログラム中の指定 |
---|---|
Shift-JIS | shift_jis |
UTF-8 | utf-8 |
ASCII | ascii |
EUC-JIS | euc_jp |
###おまけ~文字コードの判定~
エディタを開いて文字コード確認していて、面倒だなぁと思っていたのですが
プログラムで確認できるんですね…。
import chardet
with open( sample.txt, 'rb') as f:
sample = f.read()
print(chardet.detect(sample))
実行結果:{'encoding': 'utf-8', 'confidence': 0.99, 'language': ''}
これ利用したら、多くのテキストファイルの中から該当する文字コードで書かれたものだけ変換とかできて便利そう(^-^)
##参考
Pythonと文字コード