Python 本サポートページ
このページは淺尾仁彦・李在鎬 (2013) 『言語研究のためのプログラミング入門:Pythonを活用したテキスト処理』(開拓社)のサポートページです。
サンプルデータ
使い方の詳細は本書の7ページと243ページ、およびサンプルデータの中に含まれる readme.txt をご参照ください。
誤植情報
サンプルコード
本文中に登場するプログラム例です。本文中のコードをご自身で入力される代わりに、ここからコピー&ペーストして動作をお試しいただくことができます。大きく転載されるというのでないかぎり、以下のコードの断片を実際の研究などに利用していただくのに許諾は必要ありません。ご自由にお使い下さい。Ch5 Pythonでファイルの内容を表示してみよう
Ch5-1.pydatafile = open('j.txt')
for line in datafile:
line = line.rstrip()
print(line)
Ch5-2.py
# display file content
datafile = open('j.txt')
for line in datafile:
line = line.rstrip() # remove line break
print(line)
Ch5-3.py
# -*- coding: utf-8 -*-
# はじめのいっぽ
# ファイルの内容をそのまま表示する
datafile = open('j.txt')
for line in datafile:
line = line.rstrip() # 改行を取る
print(line)
Ch6 Pythonで検索しよう:条件分岐
Ch6-1.pydatafile = open('j.txt')
for line in datafile:
line = line.rstrip()
if 'the' in line:
print(line)
Ch6-2.py
datafile = open('j.txt')
for line in datafile:
line = line.rstrip()
if 'the' in line.lower():
print(line)
Ch6-3.py
# -*- coding: utf-8 -*-
datafile = open('j.txt')
for line in datafile:
line = line.rstrip()
if not line == '': # もし行が空白でないなら
print(line) # 表示する
Ch7 繰り返し処理を覚えよう:ループ
Ch7-1.py# -*- coding: utf-8 -*-
datafile = open('j.txt')
for line in datafile:
line = line.rstrip()
if line == '': # もし行が空白なら
continue # 飛ばす
print(line)
Ch7-2.py
# -*- coding: utf-8 -*-
datafile = open('h.txt')
for line in datafile:
line = line.rstrip()
if 'dog' in line: # dog があったら
print('yes!') # 'yes!'
break # ループを中断
Ch7-3.py
# -*- coding: utf-8 -*-
# 行番号を表示する
datafile = open('j.txt')
counter = 0 # カウンタをゼロに設定
for line in datafile: # ファイル内の各行について
counter += 1 # 各行ごとにカウンタを1増やす
line = line.rstrip()
print(str(counter) + ' ' + line) # カウンタの数字を付けて表示
Ch7-4.py
# -*- coding: utf-8 -*-
# ファイルの最初の10行だけ表示
datafile = open('j.txt')
counter = 0 # カウンタをゼロに設定
for line in datafile:
counter += 1 # 各行ごとにカウンタを1増やす
line = line.rstrip()
print(line)
# カウンタが10に達したら中断
if counter == 10:
break
Ch7-5.py
# -*- coding: utf-8 -*-
# tree という語があることを確かめる
atta = False # とりあえずattaは偽ということにしておく
datafile = open('j.txt')
for line in datafile:
line = line.rstrip()
print(line)
if 'tree' in line: # 'tree'という文字列があったら
atta = True # atta を真にする
if atta: # atta が真のときだけ
print('atta yo!') # 'atta yo!' と表示する
Ch7-6.py
# -*- coding: utf-8 -*-
# computer という語がないことを確かめる
atta = False # とりあえずattaは偽ということにしておく
datafile = open('h.txt')
for line in datafile:
line = line.rstrip()
if 'computer' in line: # 'computer'という文字列があったら
atta = True # atta を真にする
break # ループを中断する
if not atta: # atta が偽のときだけ
print('nakatta yo!') # 'nakatta yo!' と表示する
Ch8 単語の一覧表を作ろう:リスト
Ch8-1.py# -*- coding: utf-8 -*-
# 行をアルファベット順に並べ替える
lines = [] # 空のリストを用意
datafile = open('j.txt')
for line in datafile:
line = line.rstrip()
lines.append(line) # リストに追加
lines.sort() # リストをアルファベット順に並べ替え
# 結果の表示
for line in lines:
print(line)
Ch8-2.py
# -*- coding: utf-8 -*-
# 行をアルファベット順に並べ替える(改良版)
lines = []
datafile = open('j.txt')
lines = list(datafile)
lines.sort() # リストをアルファベット順に並べ替え
# 結果の表示
for line in lines:
line = line.rstrip()
print(line)
Ch8-3.py
# -*- coding: utf-8 -*-
# 出現した単語のリストを作る
all_words = [] # 全体の単語リストを準備
datafile = open('j.txt')
for line in datafile:
line = line.rstrip()
words_in_line = line.split() # その行を単語リストに変換
all_words += words_in_line # 全体の単語リストに追加
# 単語リストを表示する
for word in all_words:
print(word)
Ch8-4.py
# -*- coding: utf-8 -*-
# 出現した単語のリストを作る(重複なし)
all_words = [] # 全体の単語リストを準備
datafile = open('j.txt')
for line in datafile:
line = line.rstrip()
words_in_line = line.split() # その行を単語リストに変換
for word in words_in_line:
if not word in all_words: # 全体の単語リストにない時だけ
all_words.append(word) # 単語リストに追加
# 単語リストを表示する
for word in all_words:
print(word)
Ch8-5.py
# -*- coding: utf-8 -*-
# CMU辞書から単語の綴りだけを出力する
datafile = open('c.txt')
for line in datafile:
line = line.rstrip()
# コメント行を飛ばす
if line.startswith(';;;'):
continue
columns = line.split()
word = columns[0]
phonemes = columns[2:]
print(word) # 単語のみ表示
Ch8-6.py
# -*- coding: utf-8 -*-
# CMU辞書を利用して /g/ で始まる単語を集める
datafile = open('c.txt')
for line in datafile:
line = line.rstrip()
# コメント行を飛ばす
if line.startswith(';;;'):
continue
columns = line.split()
word = columns[0]
phonemes = columns[1:]
if phonemes[0] == 'G': # 最初の音素が /g/ なら
print(word) # 単語のみ表示
Ch9 頻度表を作ろう:ディクショナリ
Ch9-1.py# -*- coding: utf-8 -*-
# 頻度表を作成
freq = {} # からっぽのディクショナリを用意
datafile = open('h.txt')
for line in datafile:
line = line.rstrip()
words = line.split()
# ディクショナリに頻度を反映させる
for word in words:
if word in freq:
freq[word] += 1
else:
freq[word] = 1
# ディクショナリの中身を表示
for word in freq:
print(word + '\t' + str(freq[word]))
Ch9-2.py
# -*- coding: utf-8 -*-
# 頻度表を作成
freq = {} # からっぽのディクショナリを用意
datafile = open('h.txt')
for line in datafile:
line = line.rstrip()
words = line.split()
# ディクショナリに頻度を反映させる
for word in words:
if word in freq:
freq[word] += 1
else:
freq[word] = 1
# ディクショナリの中身を表示
for word in sorted(freq, key=freq.get, reverse=True):
print(word + '\t' + str(freq[word]))
Ch9-3.py
# -*- coding: utf-8 -*-
# 発音辞書を利用して/k/で始まる単語の頻度表を作る
# c.txt を読み込んで発音のディクショナリを作る
pronunciation = {} # からっぽのディクショナリ(発音用)を用意
datafile = open('c.txt')
for line in datafile:
line = line.rstrip()
columns = line.split()
word = columns[0]
phonemes = columns[1:]
pronunciation[word] = phonemes
# 頻度表の作成
freq = {} # からっぽのディクショナリ(頻度表用)を用意
datafile = open('h.txt')
for line in datafile:
line = line.rstrip()
words = line.split()
# ディクショナリに頻度を反映させる
for word in words:
word = word.rstrip('.,!?') # 記号類の除去
# 発音辞書に載っていなかったら飛ばす
if not word.upper() in pronunciation:
continue
# 最初の音が 'K' でなかったら飛ばす
elif not pronunciation[word.upper()][0] == 'K':
continue
if word in freq:
freq[word] += 1
else:
freq[word] = 1
# ディクショナリの中身を表示
for word in freq:
print(word + '\t' + str(freq[word]))
Ch10 ファイル操作
Ch10-1.py# -*- coding: utf-8 -*-
# 読み込むファイルをコマンドラインで指定する
import sys
filename = sys.argv[1]
datafile = open(filename)
for line in datafile:
line = line.rstrip()
print(line)
Ch10-2.py
# -*- coding: utf-8 -*-
# 指定したファイルに書き込む
import sys
inputfile = open('j.txt', 'r')
outputfile = open('ch11b_result.txt', 'w')
for line in inputfile:
line = line.rstrip()
print(line, file=outputfile)
Ch10-3.py
# -*- coding: utf-8 -*-
# 検索キーワードもコマンドラインで指定する
import sys
keyword = sys.argv[1]
filename = sys.argv[2]
datafile = open(filename)
for line in datafile:
line = line.rstrip()
if keyword in line:
print(line)
Ch10-4.py
import os
filenames = os.listdir('ch10')
for filename in filenames:
print(filename)
Ch10-5.py
# -*- coding: utf-8 -*-
# フォルダ内の全ファイルの内容を表示する
import os
folder = 'ch10'
filenames = os.listdir(folder) # ファイル名一覧を取得
# 各ファイル名について処理を繰り返す
for filename in filenames:
# ファイルを開き、その各行について処理を繰り返す
datafile = open(folder+'/'+filename)
for line in datafile:
line = line.rstrip()
print(line)
Ch10-6.py
# -*- coding: utf-8 -*-
# フォルダ内の全ファイルの内容を表示する
import os
folder = 'ch10'
filenames = os.listdir(folder)
for filename in filenames:
print(filename) # ファイル名表示
# ファイルを開き、その各行について処理を繰り返す
datafile = open(folder+'/'+filename)
for line in datafile:
line = line.rstrip()
print(line)
Ch10-7.py
# -*- coding: utf-8 -*-
# 'the' という文字列をフォルダ内の全ファイルから検索
import os
folder = 'ch10'
filenames = os.listdir(folder)
for filename in filenames:
# ファイルを開き、その各行について処理を繰り返す
datafile = open(folder+'/'+filename)
for line in datafile:
line = line.rstrip()
if 'the' in line:
print(line)
Ch10-8.py
# -*- coding: utf-8 -*-
# 特定のファイルから空白行を削除する
inputfilename = 'j.txt'
# 置換を用いて出力用のファイル名を生成
outputfilename = inputfilename.replace('.txt', '-new.txt')
# ファイルを開く
inputfile = open(inputfilename)
outputfile = open(outputfilename, 'w')
# 大文字に変換して出力
for line in inputfile:
line = line.rstrip()
print(line.upper(), file=outputfile)
Ch10-9.py
# -*- coding: utf-8 -*-
# フォルダ内の全ファイルから空白行を削除する
import os
folder = 'ch10'
# フォルダ内のすべてのファイルについて
for inputfilename in os.listdir(folder):
# 置換を用いて出力用のファイル名を生成
outputfilename = inputfilename.replace('.txt', '-new.txt')
# ファイルを開く
inputfile = open(folder+'/'+inputfilename)
outputfile = open(folder+'/'+outputfilename, 'w')
# 大文字に変換して出力
for line in inputfile:
line = line.rstrip()
print(line.upper(), file=outputfile)
Ch11 Pythonで正規表現を使ってみよう
Ch11-1.py# -*- coding: utf-8 -*-
# 正規表現にマッチした行を一覧表示する
import re
datafile = open('h.txt')
for line in datafile:
line = line.rstrip()
if re.search(r'¥bas [A-Za-z]+ as¥b', line):
print(line)
Ch11-2.py
# -*- coding: utf-8 -*-
# as ... as に現れた語を集計する
import re
freq = {}
datafile = open('h.txt')
for line in datafile:
line = line.rstrip()
result = re.search(r'¥bas ([a-z]+) as¥b', line)
if result:
word = result.group(1)
if word in freq:
freq[word] += 1
else:
freq[word] = 1
# ディクショナリの中身を表示
for word in freq:
print(word + '\t' + str(freq[word]))
Ch11-3.py
# -*- coding: utf-8 -*-
# 正規表現にマッチした箇所を強調表示する
import re
datafile = open('h.txt')
for line in datafile:
line = line.rstrip()
if re.search(r'¥bas [A-Za-z]+ as¥b', line):
output = re.sub(r'¥bas ([A-Za-z]+) as¥b', r'as *\1* as', line)
print(output)
Ch13 Pythonで日本語を扱おう
Ch13-1.py# -*- coding: utf-8 -*-
# Pythonを利用して文字コードを変換する
inputfile = open('b.txt', encoding='s-jis')
outputfile = open('b_utf8.txt', 'w', encoding='utf-8')
for line in inputfile:
print(line, file=outputfile)
Ch13-2.py
# -*- coding: utf-8 -*-
# 形態素解析結果を用いて単語の頻度表を作る
freq = {} # からっぽのディクショナリを用意
header = True # 見出し行あり
datafile = open('b2.txt', encoding='utf-8')
for line in datafile:
# 見出し行をスキップ
if header:
header = False
continue
line = line.rstrip()
# EOS (End Of Sentence) の行は無視
if line == 'EOS':
continue
columns = line.split('\t')
base_form = columns[5] # 基本形を取り出す
# 頻度のディクショナリに追加
if base_form in freq:
freq[base_form] += 1
else:
freq[base_form] = 1
# ディクショナリの中身を表示
for word in freq:
print(word + '\t' + str(freq[word]))
Ch13-3.py
# -*- coding: utf-8 -*-
# 形態素解析結果を用いて動詞のみの頻度表を作る
freq = {} # からっぽのディクショナリを用意
header = True # 見出し行あり
datafile = open('b2.txt', encoding='utf-8')
for line in datafile:
# 見出し行をスキップ
if header:
header = False
continue
line = line.rstrip()
# EOS (End Of Sentence) の行は無視
if line == 'EOS':
continue
columns = line.split('\t')
base_form = columns[5] # 基本形を取り出す
pos = columns[6] # 品詞情報を取り出す
# 動詞以外はスキップ
if not pos.startswith('動詞'):
continue
# 頻度のディクショナリに追加
if base_form in freq:
freq[base_form] += 1
else:
freq[base_form] = 1
# ディクショナリの中身を値でソートしてから表示
for word in sorted(freq, key=freq.get, reverse=True):
print(word + '\t' + str(freq[word]))
Ch14 PythonでKWIC検索を作ろう
Ch14-1.py# -*- coding: utf-8 -*-
# KWIC検索
target = '言う'
context_width = 10
words = []
header = True
# ファイルを読み込んで単語リストを作成
datafile = open('b2.txt', encoding='utf-8')
for line in datafile:
line = line.rstrip()
if header:
header = False
keys = line.split('\t')
continue
values = line.split('\t')
word = dict(zip(keys, values)) # ディクショナリの作成
words.append(word) # 単語リストに追加
# 検索
for i in range(len(words)):
# 検索語が見つかったら
if words[i]['語彙素'] == target:
# 左側文脈を作成
left_context = ''
for j in range(i-context_width, i):
if j < 0:
continue
left_context += words[j]['書字形']
# 右側文脈を作成
right_context = ''
for j in range(i+1, i+1+context_width):
if j >= len(words):
continue
right_context += words[j]['書字形']
# 出力
output = '\t'.join([
left_context,
words[i]['書字形'],
right_context])
print(output)
Ch15 コロケーション検索を作ろう
Ch15-1.py# -*- coding: utf-8 -*-
# コロケーションKWIC検索
context_width = 10
words = []
header = True
# ファイルを読み込んで単語リストを作成
datafile = open('b2.txt', encoding='utf-8')
for line in datafile:
line = line.rstrip()
if header:
header = False
keys = line.split('\t')
continue
values = line.split('\t')
word = dict(zip(keys, values)) # ディクショナリの作成
words.append(word) # 単語リストに追加
# 検索
for i in range(len(words)):
# 最後の単語はチェックしない
if i+1 >= len(words):
continue
# 検索条件にマッチしたら
if words[i]['品詞'].startswith('動詞') and words[i+1]['語彙素読み'] == 'ニクイ' and words[i+1]['品詞'] == '接尾辞-形容詞的':
# 左側文脈を作成
left_context = ''
for j in range(i-context_width, i):
if j < 0:
continue
left_context += words[j]['書字形']
# 右側文脈を作成
right_context = ''
for j in range(i+1, i+1+context_width):
if j >= len(words):
continue
right_context += words[j]['書字形']
# 出力
output = '\t'.join([
left_context,
words[i]['書字形'],
right_context])
print(output)
Ch15-2.py
# -*- coding: utf-8 -*-
# コロケーションKWIC検索(複数ファイル版)
import os
folder = 'ch15'
context_width = 10
words = []
# ファイルを読み込んで単語リストを作成
filenames = os.listdir(folder)
for filename in filenames:
header = True
datafile = open(folder+'/'+filename, encoding='utf-8')
for line in datafile:
line = line.rstrip()
if header:
header = False
keys = line.split('\t')
continue
values = line.split('\t')
word = dict(zip(keys, values)) # ディクショナリの作成
words.append(word) # 単語リストに追加
# 検索
for i in range(len(words)):
# 最後の単語はチェックしない
if i+1 >= len(words):
continue
# 検索条件にマッチしたら
if words[i]['品詞'].startswith('動詞') and words[i+1]['語彙素読み'] == 'ニクイ' and words[i+1]['品詞'] == '接尾辞-形容詞的':
# 左側文脈を作成
left_context = ''
for j in range(i-context_width, i):
if j < 0:
continue
left_context += words[j]['書字形']
# 右側文脈を作成
right_context = ''
for j in range(i+1, i+1+context_width):
if j >= len(words):
continue
right_context += words[j]['書字形']
# 出力
output = '\t'.join([
words[i]['出典'],
left_context,
words[i]['書字形'],
right_context])
print(output)
Ch15-3.py
# -*- coding: utf-8 -*-
# コロケーションKWIC検索
conditions = [
{'position': 0, 'key': '品詞', 'value': '動詞'},
{'position': 1, 'key': '語彙素読み', 'value': 'ニクイ'},
{'position': 1, 'key': '品詞', 'value': '接尾辞-形容詞的'}]
context_width = 10
words = []
header = True
# ファイルを読み込んで単語リストを作成
datafile = open('b2.txt', encoding='utf-8')
for line in datafile:
line = line.rstrip()
if header:
header = False
keys = line.split('\t')
continue
values = line.split('\t')
word = dict(zip(keys, values)) # ディクショナリの作成
words.append(word) # 単語リストに追加
# 検索
for i in range(len(words)):
# 検索条件がコーパスの範囲内でないときはスキップ
positions = []
for cond in conditions:
positions.append(cond['position'])
if i + min(positions) < 0 or len(words) - 1 < i + max(positions):
continue
# 条件を全て満たすかどうかチェック
matched = True
for cond in conditions:
if cond['key'] in ['品詞', '活用形']:
if not words[i+cond['position']][cond['key']].startswith(cond['value']):
matched = False
break
else:
if not words[i+cond['position']][cond['key']] == cond['value']:
matched = False
break
# 検索条件にマッチしたら
if matched:
# 左側文脈を作成
left_context = ''
for j in range(i-context_width, i):
if j < 0:
continue
left_context += words[j]['書字形']
# 右側文脈を作成
right_context = ''
for j in range(i+1, i+1+context_width):
if j >= len(words):
continue
right_context += words[j]['書字形']
# 出力
output = '\t'.join([
left_context,
words[i]['書字形'],
right_context])
print(output)