OCR機能ができてきたので、次は文章を分割するコードを作成することにしました。
2000文字などで区切ると文章の意味が繋がりません。
そのため一定の文字数以上取得したら、つぎに現れる句点(。)で区切ることを検討しました。
また、句点で区切っても文章全体の意味が捉えられないかもしれないので、章立てでも区切ることにしました。基準は改行が多いことです。
ただ、基準を改行が多いことにすると別の本を処理するときに応用が効かなくなります。
実際のコードをchatGPTに生成させたところ、句点区切りができません。
どういうわけか、「。」のない普通の行を分割してしまっていました。
そのため自分で書きました。
# 文章を指定文字列を基準に分割する
def split_text_conse(text, split_str):
chunks = []
start = 0
while start < len(text):
try:
end = text.index(split_str, start) + len(split_str)
chunk = text[start:end]
chunks.append(chunk)
start = end
except ValueError:
# split_str が見当たらない場合、残りのテキストを追加して終了
chunks.append(text[start:])
break
return chunks
改行が多いことだけでも十分機能しました。
また、チャンクが小さいとgttsによる音声読み上げにしてもchatGPTにわたす要約としても全体の処理量、データ量が多くなるので一定の文字数以下ならチャンクを結合させるコードも作りました。
# 与えられたチャンクが一定の文字数以下なら結合させる
def combine_chunks(chunks,limit):
new_chunks = []
current_chunk = ""
for chunk in chunks:
if len(current_chunk) + len(chunk) <= limit:
current_chunk += chunk
else:
new_chunks.append(current_chunk)
current_chunk = chunk
if current_chunk: # 残りの部分があれば、それも追加
new_chunks.append(current_chunk)
return new_chunks
これで文章を分割処理するコードができました。
追記:
これは車輪の再発明でした。
後でchatGPTに書かせたらsplit()関数を用いた簡略的に作れるコードができました。
split()を用いて作ったコードは以下です。
split()を使うと末尾の判定に使った文字列が削除されるので追加しています。
# 文章を指定文字列を基準に分割する
def split_text(text, split_str):
chunks = []
results = re.split(split_str, text)
for result in results:
chunks.append(result + split_str)
return chunks