導入
いちばん単純な分割方法は、「N文字ごとに機械的に切る」やり方です。実装が簡単なぶん、どんな文書にもすぐ使えます。
説明
def chunk_fixed(text, size):
return [text[i:i+size] for i in range(0, len(text), size)]
text = "Retrieval augmented generation splits documents into chunks for search."
chunks = chunk_fixed(text, 20)
print("Number of chunks:", len(chunks))
for i, c in enumerate(chunks):
print(f"[{i}] {c!r}")
chunk_fixed は、range(0, len(text), size) で先頭位置を size ずつずらしながら、text[i:i+size] でその位置から size 文字を切り出しています。仕組みはこれだけです。
ただし出力をよく見てください。単語の途中でぶつ切りになっている箇所があります(たとえば "for sea" と "rch." のように、"search" という単語が2つのチャンクにまたがって分断されてしまいます)。文字数だけを基準にしているので、単語や文の切れ目は一切考慮されません。これが固定長チャンクの弱点です。
やってみよう
chunk_fixed(text, 10) や chunk_fixed(text, 30) のように size を変えて、チャンク数と1つあたりの内容がどう変わるか比べてみましょう。
演習
chunk_fixed を使って、text を size=15 で分割し、できたチャンクの個数を print で表示してください。
ヒント1を見る
chunks = chunk_fixed(text, 15) としてから len(chunks) を表示します。
ヒント2を見る
print(len(chunk_fixed(text, 15))) のように1行で書いても構いません。