Python(英文のデータベース化002: ファイルから文への分解)
■テキストファイルを読み込み、文章を文へ分ける。
まずは、テキストファイルの読み込み。
下のように、sampletext.txtをopen関数で開き、readlines()で1行ずつ読み込む。読み込んだ内容は、解析の対象となる1行ごとにリストとして保管。
f = open("sampletext.txt", 'r', encoding='UTF-8')
filelinelist = f.readlines()
for data in filelinelist:
print(data)
f.close()
読み込みは簡単にできたので、次に分解について考えてみる。
下の文章を例としたとき、ピリオド(.)やクエスションマーク(?)を区切り位置とし、①から④までの文に分けられる。
With sea levels expected to rise between 20 and 90 centimeters over the next century, those involved in urban development will face significant obstacles.① Low-lying areas will be submerged and flood zones will expand, meaning the land available for development will decrease.② At the same time, the human population will continue to grow.③ So what can be done to tackle these conflicting issues?④
区切る方法は、(文字列変数).find(".")で、ピリオドが初めて出てくる位置番号が得られるので、それを使用し、(文字列変数)[:(位置番号)]で文字列の初めから位置番号までの文字列を抽出する方法とした。ピリオドがない場合は-1が返される。抽出した文字列をリストに追加し、解析の対象を抽出した後の残りの文字列に更新する。
while True:
period_location_num = data.find(".")
question_location_num = data.find("?")
if period_location_num == -1:
delimiter = question_location_num
elif question_location_num == -1:
delimiter = period_location_num
else:
delimiter = min(question_location_num, period_location_num)
if delimiter == -1:
break
else:
linelist.append(data[:delimiter].strip())
data = data[delimiter + 1:]
上の英文のように改行直前の文字がピリオドやクエスションマークで終了していればいいけど、実際PDFなどをテキストファイルに落とし込んだ時に、思わぬところで改行されている場合がある。つまり、下のような場合。これにも対応したい。
With sea levels expected to rise between
20 and 90 centimeters over the next
century, those involved in urban development
will face significant obstacles. Low-lying
areas will be submerged and flood zones
will expand, meaning the land available for
development will decrease. At the same
time, the human population will continue to
grow. So what can be done to tackle these
conflicting issues?
この場合、1行目は「With sea levels expected to rise between」であり、ピリオドが存在しない。そのため、これをテンポラリの変数に入れて、2行目の先頭に結合させる。2行目を見てみると、こちらもピリオドが存在しない。この1行目と2行目が結合したものを3行目の先頭に結合させる。これを繰り返し、4行目でやっとピリオドが出てくるので、ピリオドより前のものを一文として処理する。
今回、作成したコードが下のもの。 txtfile_to_linesというメソッドの中で、テキストファイルを入力し、ピリオドやクエスションマークで区切った文のリストを戻している。
def txtfile_to_lines(filename):
f = open(filename, 'r', encoding='UTF-8')
linelist = []
filelinelist = f.readlines()
templine = ""
for data in filelinelist:
data = templine + data
while True:
period_location_num = data.find(".")
question_location_num = data.find("?")
if period_location_num == -1:
delimiter = question_location_num
elif question_location_num == -1:
delimiter = period_location_num
else:
delimiter = min(question_location_num, period_location_num)
if delimiter == -1:
if len(data) > 1:
templine = data.strip()
else:
templine = ""
break
else:
linelist.append(data[:delimiter].strip())
data = data[delimiter + 1:]
f.close()
return linelist
linelist = txtfile_to_lines("sampletext.txt")
for line in linelist:
print(line)
上の改行を含んだテキストでコードを試してみると、下のようにうまく区切られた結果となった。
セミコロンやコロンの扱いをどうするかとかスペースが2つある部分をどうするかとか細かいところはいろいろありそうだけど、基本的な文への分解はこんなところかなー。