インターネット上のあらゆるPDFを分類する
(snats.xyz)- SafeDocs の約 840万件のPDFを、本文ではなくURLメタデータで分類し、大規模な文書コーパスを現実的なコストでタグ付けしようとする実験
- 8TBのPDF全体ではなく、約 8GBのメタデータとLLM生成ラベルを使い、FineWeb式のteacher/studentアプローチをPDF URL分類に適用
- 単一のディープラーニング分類器は
Alibaba-large-gte-1.5基準で 59.14%の精度にとどまったが、URL埋め込みとXGBoostの組み合わせは、ハイパーパラメータ探索後に 85.26% まで向上 - TF-IDFベースのXGBoostとLinearRegressorのアンサンブルもそれぞれ 67.52%、70.68% を記録し、単純な従来型NLP手法が初期のディープラーニング基準線を上回った
- 最終ラベルデータセット、埋め込み、元データのダウンロード情報、コードを公開しており、PDF分類やVLM/Omniモデル向けデータパイプライン実験に再利用できる
SafeDocs PDFコーパスと分類目標
- Common Crawlはインターネットのウェブアーカイブであり、PDFに遭遇した場合、ファイル全体ではなく 先頭1MBのみを保存し、残りは切り捨てる
- SafeDocs または
CC-MAIN-2021-31-PDF-UNTRUNCATEDは、Common CrawlスナップショットのPDFを再取得し、切り捨てられていない版として作成したコーパス - このデータセットは約 840万件のPDFで構成され、展開後の総量は 8TB 規模
- 目標はPDFをトピックラベルで分類すること
- 例: Linear Algebra のPDFは Math
- 例: Anatomy の教科書は Medicine
URLメタデータでラベルを作る
- 8TBの本文全体を直接処理せず、元データセットの メタデータを使用
- メタデータは約 8GBのテキスト
- 主なカラムは
url
- URLのファイル名は文書の性質を推定する手がかりになる
- 例:
Introduction_to_Python_Programming_-_WEB.pdf - このファイル名は、教育または技術関連の文書である可能性を示している
- 例:
- ラベリング方法はFineWebのアプローチから採用
- LLMが非構造化テキストからラベルを生成する teacher
- 生成されたラベルでより小さな分類器を学習する student
- プロンプトとLlama-3-70Bを together APIで使用し、初期の 10万件のラベルを生成
- ラベル分布が不均衡で小さなクラスが多いため、250件未満のラベルは
otherに統合 - 各ラベルから最大 5,000サンプルだけを取得してバランスを取り、合計 5.9万件のラベルデータセットを作成
埋め込みモデルのファインチューニングを試す
- 最初のアプローチは、URLテキストを埋め込みモデルで処理し、分類問題に合わせて ファインチューニングする方法
- FineWeb Eduは snowflake-arctic-embed-m を使用していたが、実験では Massive Text Embeddings Benchmark の上位モデルも検討
- 約7Bパラメータのモデルでは800万件のPDFを高速に分類するのは難しいと考え、より小さな候補を実験
Stella_en_400Mgte-large-1.5- Arctic Embed
all-mpnet-basedistillbertflant-t5-smallbert-base-uncased
- Hugging Faceを使い、ベースモデルを固定して埋め込みと分類ヘッドだけを学習し、ノートPCでも実行
- この方法で最も良かったモデルは
Alibaba-large-gte-1.5で、精度は 59.14% だった
XGBoostで性能を引き上げる
- 2つ目のアプローチは、埋め込みモデルを直接分類器として使わず、URL埋め込みを作成したうえで XGBoostの入力として使う方法
- テキストを埋め込みに変換した後、表形式データのようにXGBoostを学習
- PDFリンク全体の埋め込みを生成しており、展開後で約 40GB
- 埋め込みデータは Kaggle で公開
- 1つの大きな分類器ではなく、クラスごとの 二値分類器を学習
- このアイデアは古い Kaggle competition から採用
- XGBoost埋め込みモデルの平均性能は以下の通り
- accuracy: 0.839750
- precision: 0.859758
- recall: 0.819733
- f1: 0.838937
- このアプローチは初期のディープラーニング手法より 24.83ポイント 高い精度を出した
TF-IDFとLinearRegressorの結果
- 3つ目のアプローチは、ディープラーニング埋め込みなしで TF-IDF によりテキスト特徴量を作成し、モデルを学習する方法
- TF-IDFは、特定の文書では頻出するがコーパス全体ではまれな単語に、より高い重みを与える手法
- TF-IDFベースのXGBoost性能は以下の通り
- accuracy: 0.675200
- precision: 0.683185
- recall: 0.646316
- f1: 0.662497
- TF-IDFベースのLinearRegressorアンサンブルも実験
- accuracy: 0.706802
- precision: 0.723558
- recall: 0.663038
- f1: 0.690286
- どちらの方法も、初期のディープラーニング基準線である 59.14% より高い精度を出した
より多くのLLMラベルでディープラーニングを再試行
- 単一のディープラーニング分類器の目標を 70%精度に設定し、より多くのラベルを生成
- 追加ラベルはLlama3.1-7Bで 40万件 生成
- 以前より小さいモデルを使った理由は推論コストを下げるため
- 実験では、データが多いほど性能が向上する結果になった
- Metaの The Llama 3 Herd of Models の影響を受け、
roberta-baseと既存のgte-largeを実験 gte-largeは学習データセットで最大 69.22%の精度を記録
モデル別の最終性能
- 実験結果は以下の通り
| Model Name | Accuracy |
|---|---|
| gte-large naïve (59k labels) | 59.14% |
| XGBoost embeddings | 83.97% |
| XGBoost Tf-Idf | 67.52% |
| LinearRegressor Tf-Idf | 70.68% |
| gte-large naïve (400k labels) | 69.22% |
| XGBoost Embeddings HyperParameter Sweep | 85.26% |
- 最終的に最も良かったモデルは XGBoost embeddingsだった
- ハイパーパラメータ探索を適用したXGBoost埋め込みモデルが、85.26%の精度で最も高い結果を出した
コーパス全体の分類と可視化
- 最終コードは、埋め込みをメモリにロードした後に予測を行う単純な構造
- PDF全体のタグ予測には約 1時間かかった
- GPU実行設定をしていなかったため、GPUは使用していない
- PCAとUMAPで予測結果と埋め込みを可視化
- PCAはデータセット全体の約 850万点を1枚の画像に可視化
- UMAPはより大きなマシンを借りて実行
- Azure
Standard_E48s_v3 - 48コア
- 384GB RAM
- 768GBディスク
- UMAPは 650万点まで実行できたが、それ以上はメモリ不足に近かった
- Azure
公開されたデータとコード
- 最終データセットは Hugging Face repo で公開
- 埋め込みだけが必要な場合は Kaggle dataset から入手できる
- 元のSafeDocsデータセットのダウンロード情報は S3 bucket にある
- 分類コードはGitHub monorepoの classify_metadata パスにある
- PDFはデータと画像が混在した形式であるため、VLM/Omniモデルの学習パイプラインで今後より頻繁に使われる可能性があると見ている
1件のコメント
Hacker Newsのコメント
2009年ごろ、Elsevier や Springer のような科学出版社の約570万本の研究論文(PDF、非公開コーパス)を対象に、似たような可視化作業をしたことがある。
Newton, G., A. Callahan & M. Dumontier. 2009. Semantic Journal Mapping for Search Visualization in a Large Scale Article Digital Library. Second Workshop on Very Large Digital Libraries at the European Conference on Digital Libraries (ECDL) 2009. https://lekythos.library.ucy.ac.cy/bitstream/handle/10797/14...
私が筆頭著者。
2009年のベンチマークが13時間だったなら、今ならどれくらい速く終わるのか気になる。
今ならみんなそのデータをUMAPに流し込むだろう。
それとアンパサンド
&にandと違う意味があるのか、それとも単なる引用スタイルなのかも気になる。埋め込みについて最近あまり語られない利点のひとつは、従来の統計モデリング手法をほぼそのまま適用でき、さらにステミングのような一般的な自然言語処理の前処理に伴う微妙さや落とし穴を避けられること。
この記事は特に長文書に対して、自然言語処理の最初のステップとして直接LLM埋め込みを使うのが実用的な理由をよく示している。
筆者です。この記事が HN の一番上に来るとは思っていなかったし、何でも聞いてほしい。
コードを見てみたが、見慣れないものが多く、Python そのものよりも、自分の知らない分析手法が多い気がした。
PDF はすでに分類されていたのだろうか?
面白く、細部も多い記事だった。ただ、一対多の二値学習でクラスバランスを取って、推論で最大確率を使うと、確率が適切に較正されない可能性があり、それが問題になりうる。
argmaxを取る前に確率較正を別途しているのか気になる。2006年にも教科書の1TBのトレント集がいくつもあった。
今ではサイズも数ももっと増えているはず。
2008年までは、教科書、解答集、関連 PDF やその他の資料を見つけるのは、6〜8年後よりずっと簡単だった記憶がある。
最大の違いは、Chegg のようないくつものサイトがそうした資料を吸い上げ、何らかの形で再販売し始めたことだ。
ほとんどが電子工学や工学関連の資料で、2年ほど前に GraphQL と OSR の資料をいじってみたくてトレントから入手したものだ。
手元に20〜40TBほどの PDF がある(重複排除前)。
8TB でも多いが、世の中にある PDF 全体の規模にはまったく近くない。
私も読むために集めた電子書籍、PDF、漫画のコレクションはかなりあるが、20TB のライブラリがどれほど大きいのかは想像しにくい。
8TB よりはるかに多くの PDF があるのは確かだ。たぶんその中には重複も多いだろうが、画像が多くて重複排除がうまくいかない気がする。
面白くて楽しい記事。PDF から表形式データを抽出するために、複数の LLM / 生成 AI ソリューションを試してみたが、結果は期待ほどではなかった。
テキスト文字列の抽出や要約、たとえば合計金額はいくらか、いつ発行されたかといった質問にはうまく答えるが、CSV として安定して取り出すにはかなり誤差がある。
Aryn partitioning service を試してみるとよいかもしれない: https://www.aryn.ai/post/announcing-the-aryn-partitioning-se...
最近リリースされたもので、PDF の表データを pandas データフレームに変換する例もある。その後 CSV に変換できる: https://sycamore.readthedocs.io/en/stable/aryn_cloud/get_sta...
すばらしい。Airtrain でも埋め込みが分類モデルを作るうえで非常に価値があることを確認した。
大量のテキストと埋め込みを扱ってみたいなら、最近 fineweb-edu(記事でも言及されている)全体を重複排除して埋め込み、結果のデータセットを Hugging Face に上げておいた: https://huggingface.co/datasets/airtrain-ai/fineweb-edu-fort...
とても良いアイデア。最近はあまり自由時間がないが、少し前に似ているようで別のプロジェクトをやってみようかと考えていた。
社会科学に役立つ時系列データをダウンロードするオープンソースツールを作りたかった。たとえば食料品価格に関するソーシャルメディアのコメントの時系列のようなもの。
LLM のおかげで、まだあまり使われていない新しい研究の切り口がいくつも開けた気がする。
いつかそのサイドプロジェクトに取り組むことがあれば、いくつか良いアイデアを借りるかもしれない。
すばらしい仕事。国立図書館がときどきやる方法と似ていて、複数のアプローチを組み合わせていた。私もいろいろな埋め込み → 分類器や LDA を試してきた。
プロンプトが気になる: https://github.com/snat-s/m/blob/main/classify_metadata/prom...
これは実質的にURL の種類で分類するようにプロンプトを与えているのと同じではないだろうか?