(2017-10-16改訂)
実は青空文庫からテキスト解析用のプレーンテキストを入手
とこの書込みは続き物シリーズだったのですが、「なんで前処理だけPerlなの」とか「そもそも2つまとめてできるよね」というツッコミが自分から出て、改訂しました。
その結果、すごくシンプルにまとまりましたので、以下の記事を書き直しておきます。
いい品質のプレーンテキストは、なかなかネットでも入手できないものです。
いろいろ調べて青空文庫にたどり着いたのですが、問題はテキスト型で提供されているデータにはルビの情報も含まれていた点。
そこで、前処理としてルビを含めた余分な情報を取り除いてテキストファイルを作る仕組みを作りました。
また、日本語でテキスト解析を行う場合の次の課題は形態素解析。
こちらに関してはjanomeを形態素解析として使い、名詞のリストを作る簡単なPythonスクリプトを作ってみました。
以下は、Jupiter notebook上のスクリプトになります。
(kokoro.txtが解析対象テキストである前提)
!pip install janome
# 青空文庫からダウンロードした元ファイル(ルビ付き、SJIS)を読み込む
f = open('kokoro.txt')
txt = f.read()
f.close()
# 前処理開始
# SJISコードの文字列をunicode内部表現形式に変換
txt2 = unicode( txt, encoding='SJIS')
# 置換用の関数のimport
import re
# ルビなどの削除
txt2 = re.sub(u'《[^》]+》', '', txt2)
txt2 = re.sub(u'|', '', txt2)
txt2 = re.sub(u'[.+?]', '', txt2)
# ヘッダ部分の削除
txt2 = re.sub(u'-----[\s\S]*-----', '', txt2)
# フッタ部分の削除
txt2 = re.split(u'底本:',txt2)[0]
# 改行の削除
txt2 = re.sub(u'\n', '', txt2)
txt2 = re.sub(u'\r', '', txt2)
# janomeを使った名詞リストの作成
word_list = []
from janome.tokenizer import Tokenizer
t = Tokenizer()
for token in t.tokenize(txt2, stream=True):
partOfSpeech = token.part_of_speech.split(',')[0]
if partOfSpeech == u'名詞':
word_list.append(token.surface)
print '===='
print word_list[0]
print word_list[1]
処理が終わった段階でword_listに名詞の配列が入っていますので、これをその後工程で使う想定です。
工夫した点は以下のようなところ。
- PythonもPerlみたいに文字表現形式が2タイプあるらしく、文字処理をしたい場合、unicode関数にかけて、string形式からunicode形式に変換をかけます。
- janomeの最新版(v0.3.1 以上)では「ストリーミングモード」というものがあるので、変換時にこのモードを使っています。大量文書処理時に、メモリーを余り使わないという効果があるみたいです。