Q: hello | A: hello friend.
Q: hi | A: hi friend.
Q: name | A: i am xslm.
Q: sun | A: the sun is warm.
Q: cat | A: a cat can nap.
Q: dog | A: a dog can run.
Q: red | A: red is a color.
Q: blue | A: blue is a color.
Q: learn | A: i learn from text.
Q: code | A: i can learn code.
Q: moon | A: the moon is in the sky.
Q: rain | A: rain is water.
Q: book | A: i can read a book.
Q: tea | A: tea is warm.
Q: bye | A: bye friend.
prepare.py手入力する完全なソース
UTF-8読込、重複除去、文単位分割、学習・検証の保存を行います。
from pathlib import Path
lines = [line.strip() for line in Path('data/raw.txt').read_text(encoding='utf-8').splitlines() if line.strip()]
lines = list(dict.fromkeys(lines))
assert len(lines) >= 5, 'write at least five different Q/A lines'
assert all(' | A:' in line and line.startswith('Q:') for line in lines)
train = [line for i, line in enumerate(lines) if i % 5 != 0]
val = [line for i, line in enumerate(lines) if i % 5 == 0]
for name, rows in [('train', train), ('val', val)]:
text = '\n'.join(row.replace(' | A:', '\nA:') for row in rows) + '\n'
Path('data/' + name + '.txt').write_text(text, encoding='utf-8')
print(name, len(rows))
コードを1行ずつ読み解く
自分で入力したソースを小さく分けて読みます。左の数字はファイルの実際の行番号です。の line の数字と照らし合わせながら読んでください。
prepare.py 元の資料の読み込みと重複の削除
from pathlib import Pathlines = [line.strip() for line in Path('data/raw.txt').read_text(encoding='utf-8').splitlines() if line.strip()]lines = list(dict.fromkeys(lines))
Path(…).read_text(encoding='utf-8') でファイル全体を文字として読み、splitlines() で行ごとに分けます。内包表記 [line.strip() for line in … if line.strip()] は前後の空白を消し、空行は捨てます。dict.fromkeys(lines) は行をに入れて重複をなくしますが、 のは入れた順序を守るので、最初に出てきた順序がそのまま残ります。set を使うと順序が実行ごとに変わり、学習・検証の分け方が変わることがあります。
prepare.py 形式の検査
assert len(lines) >= 5, 'write at least five different Q/A lines'assert all(' | A:' in line and line.startswith('Q:') for line in lines)
for name, rows in [('train', train), ('val', val)]: text = '\n'.join(row.replace(' | A:', '\nA:') for row in rows) + '\n' Path('data/' + name + '.txt').write_text(text, encoding='utf-8') print(name, len(rows))