LlamaIndexのSimpleDirectoryReaderのソースを読む
先日試したLlamaIndexはバージョン0.7.2だったので、その時のソースを読む。
目的は、読み込むファイルの拡張子によって学習する内容がどの程度違うのかを知ること。とくにtxtとcsvとpptxについて知りたい。
まずはこのファイルを読むと、 SimpleDirectoryReader
は llama_index.readers
に定義されていることがわかる。
よって、次はこれを読む。すると SimpleDirectoryReader
は llama_index.readers.file.base
に定義されていることがわかる。
よって、次はこれを読む。
SimpleDirectoryReader
の定義が見つかる。
SimpleDirectoryReader
のクラスのソースはそんなに長くないので、ひととおり全部読む。
DEFAULT_FILE_READER_CLS
に拡張子ごとのReaderクラスのマッピングが定義されている。
".pptx": PptxReader,
".csv": PandasCSVReader,
マッピングされている拡張子のファイルであればそのReaderがデータを抜き出す。それ以外の拡張子は無条件にUTF-8のテキストファイルとみなして、そのテキストを抜き出している。ということが SimpleDirectoryReader
の定義からわかる。
PptxReader
は以下のファイルで定義されている。
スライドごとに、 Slide #{i}:
というような文字列でスライド番号とともに、スライドに含まれるテキストを抜き出し、最終的にそれを全部改行で区切って1つのテキストにしている。
テキストだけでなく画像も抜き出している。
transformers
の VisionEncoderDecoderModel
, ViTFeatureExtractor
, AutoTokenizer
というのを使っているらしい。
いずれにせよ最終的には、テキストとして抜き出したものをすべて改行区切りで連結して1つのテキストにしている。
脱線だが、 .jpg
, .jpeg
, .png
を処理する ImageReader
も同じ仕組みなのだろうかと思って、読んでみる。
pptxと違って、 VisionEncoderDecoderModel
と DonutProcessor
というのを使っているようだ。
.csv
を処理する PandasCSVReader
は以下のファイルで定義されている。このファイルの後半である。
行ごとにカラムの値を ,
で連結し、最後にすべての行を改行で連結して1つのテキストにするのがデフォルトの処理。
concat_rows
というオプションを指定すれば、各行をそれぞれ別々のドキュメントとして扱うようだ。
オプションを指定するには PandasCSVReader
のインスタンスを自分で生成する必要がある。生成したインスタンスは SimpleDirectoryReader
のコンストラクタに渡す。
結論
CSVだろうがPPTXだろうが、行やページの区切りを意識することなく、単に改行で連結したテキストを生成しているだけ。CSVはカラムの構成も考慮されない。