Kuroyagi飼育日誌

学んだことの備忘録

英単語帳作成~その2~

【記事1】
英単語帳作成~その1~ - Kuroyagi飼育日誌



上記記事の続きをやっていきます。



■1. PDFからtxt抽出
□2. txtから抽出した単語リストを生成
□3. 単語リストから同一単語のカウントして重複なし単語リストを生成
□4. 単語の頻出順にソート



今回は2、3、4の部分を一気にやってしまいます。


【記事2】
www.lifewithpython.com




こんな素敵なサンプルを紹介してくださっているサイトがあるので参考にします。




先ずはサンプルが動くか確認してみると




【サンプルコード1:単語集計】

# ライブラリの読み込み
import re
from collections import Counter

# 00 テキストの取得
target_text = """
Python is a remarkably powerful dynamic programming language that is used in a wide variety of application domains. Python is often compared to Tcl, Perl, Ruby, Scheme or Java. Some of its key distinguishing features include:

very clear, readable syntax
strong introspection capabilities
intuitive object orientation
natural expression of procedural code
full modularity, supporting hierarchical packages
exception-based error handling
very high level dynamic data types
extensive standard libraries and third party modules for virtually every task
extensions and modules easily written in C, C++ (or Java for Jython, or .NET languages for IronPython)
embeddable within applications as a scripting interface
"""

# 01 文章を単語に分ける
# 複数の区切り文字を指定するため re.split を使う
words = re.split(r'\s|\,|\.|\(|\)', target_text.lower())

# 02 集計する
counter = Counter(words)

# 03 表示する
# Counter#most_common を使って出現頻度の降順に csv 形式で表示する
for word, count in counter.most_common():
    if len(word) > 0:
        print("%s,%d" % (word, count))
# => csv 形式の単語出現回数

ちゃんと動きました。



サンプルではソースコード内にテキストがありますが、実際の【記事1】ではPDFから文字をtxtファイルに書き込んだ物を使うので、txtファイルを指定するように改造します。



ソースコード2:単語集計改】

# ライブラリの読み込み
import re
from collections import Counter

# 00 テキストの取得
f= open('text.txt','r',encoding='UTF-8')
target_text = target_text  = f.read()


# 01 文章を単語に分ける
# 複数の区切り文字を指定するため re.split を使う
words = re.split(r'\s|\,|\.|\(|\)', target_text.lower())

# 02 集計する
counter = Counter(words)

# 03 表示する
# Counter#most_common を使って出現頻度の降順に csv 形式で表示する
for word, count in counter.most_common():
    if len(word) > 0:
        print("%s,%d" % (word, count))
# => csv 形式の単語出現回数

pythonではtxtを扱ったことがなかったので、はじめはopenでのファイル取得でencordingを指定しなかったが為にcp932のエンコードエラーと出てしまい、プログラムが動きませんでした。【ソースコード2】のように文字エンコードを指定すると問題なく動きます。



ただ、この段階ではまだコンソール上に結果を出力するだけなので、テーブルの形式でファイルとして保存されるようにさらに改造します。



ソースコード3:単語集計改2】

# coding: UTF-8

# ライブラリの読み込み
import re
from collections import Counter
import csv

# 00 テキストの取得
f= open('text.txt','r',encoding='UTF-8')
target_text  = f.read()
f.close()

# 01 文章を単語に分ける
# 複数の区切り文字を指定するため re.split を使う
words = re.split(r'\s|\,|\.|\(|\)', target_text.lower())

# 02 集計する
counter = Counter(words)

# 03 csvへの書き込み関数の定義
def add(x):
    with open('data.csv','a',encoding='UTF-8',newline='') as f:
        csvwriter = csv.writer(f)
        csvwriter.writerow(x)

def reset(x):
    with open('data.csv','w',encoding='UTF-8',newline='') as f:
        csvwriter = csv.writer(f)
        csvwriter.writerow(x)

# 04 ファイルの初期化
label = []
label.append('tanogocho')
reset(label)

# 05 集計結果の出力とcsvへの書き込み
for word, count in counter.most_common():
    csvlist = []
    if len(word) > 0:
        # print("%s,%d" % (word, count))
        csvlist.append(word)
        csvlist.append(count)
        add(csvlist)

# ファイルクローズ
f.close()

#03ではチェックする為に何回もファイルに書き込む仕様上、csvの追記モードのみだと無駄な記録がcsv内に残るのでreset用の関数を定義しています。


また、単語の間に空白行が入ってしまう対策としてopenのオプションとしてnewlineを''にしています。



以上のスクリプトで生成されたcsvをエクセルで開いてみるとこんな感じです。




【画像1:単行集計の出力結果】
f:id:cocosuzu:20171007200859p:plain



なんとか出来上がりました。



もっと複雑になり、記事も複数回になるかと思ったら直ぐに終わってしまいました。一応チェックリストをつけておかないと気持ち悪いのでつけておくと




■1. PDFからtxt抽出
■2. txtから抽出した単語リストを生成
■3. 単語リストから同一単語のカウントして重複なし単語リストを生成
■4. 単語の頻出順にソート



となります。完了!






参考記事
【記事1: 前回の記事】
英単語帳作成~その1~ - Kuroyagi飼育日誌

【記事2: 単語集計参考】
Python Tips:文章中の単語を集計したい - Life with Python

【記事3: セルとCSVの取り扱い】
Pythonの基礎 ファイル(CSV)に書き込む編 - Pythonの学習の過程とか

【記事4: CSVへの書き込み】
Pythonでcsvファイルにデータを書き込みをする基本中の基本