2019年8月1日木曜日

開発環境

はじめての機械学習 (小高知宏(著)、オーム社)の第3章(帰納的学習)、3.1(暗記学習)、3.1.3(日本語テキストデータの学習)、n-gramの出現頻度の解析(rankプログラム)をC言語ではなくPythonで取り組んでみる。

コード

Python 3

ngrams.py

#!/usr/bin/env python3
import sys

if len(sys.argv) != 2:
    print('Usage: ngram <N>', file=sys.stderr)
    sys.exit(1)

n = sys.argv[1]
try:
    n = int(n)
    if n < 1:
        raise ValueError('nの値が不適切です。')
except ValueError as err:
    print(err, file=sys.stderr)
    sys.exit(1)

ngram = sys.stdin.read(n)
print(ngram)
while True:
    c = sys.stdin.read(1)
    ngram = ngram[1:] + c
    if ngram == '':
        break
    print(ngram)

rank.py

#!/usr/bin/env python3
import sys
from collections import Counter

counter = Counter((s[:-1] for s in sys.stdin))

for ngram, count in counter.most_common():
    print(f'{count:4} {ngram}')

入出力結果(Bash、cmd.exe(コマンドプロンプト)、Terminal、Jupyter(IPython))

$ iconv -f sjis -t utf-8 < ningen_shikkaku.txt > 人間失格.txt
$ ./ngram.py 3 < 人間失格.txt | ./rank.py > 人間失格_rank.txt
$ head 人間失格_rank.txt 
1778 
 984 
 571 した。
 452  
 388 。
 369 ました
 364 、自分
 313 でした
 296 「
 296 」
$ tail 人間失格_rank.txt 
   1 あたっ
   1 、ボラ
   1 ボラン
   1 ランテ
   1 ンティ
   1 ティア
   1 ィアの
   1 アの皆
   1 の皆さ
   1 皆さん
$ head -20 人間失格_rank.txt 
1778 
 984 
 571 した。
 452  
 388 。
 369 ました
 364 、自分
 313 でした
 296 「
 296 」
 290 自分は
 271 た。
 214 ている
 199 、その
 186 ってい
 181 という
 178 自分の
 167 たので
 164 のです
 162 、それ
$ 

元のテキストの文字コードを変換するだけでそのほかは特に必要な修正は無し。ファイルの読み込み時にShift_JISとして読み込むこともできるけど、UTF-8の方が便利そうだから、初めにテキストを変換する方法を選択。

0 コメント:

コメントを投稿