RAGを試すためのデータが欲しかったので、WikipediaのURLを指定し、コンテンツをチャンク化してtxtに保存するコードを作成。
必要なライブラリ
以下、必要なライブラリ。
pip install langchain langchain_community beautifulsoup4 tiktoken
ソース
import os import re import shutil from langchain.document_loaders import WebBaseLoader from langchain.text_splitter import CharacterTextSplitter from typing import List, Dict from concurrent.futures import ThreadPoolExecutor def clean_filename(filename: str) -> str: """ファイル名から不要な文字を除去""" return re.sub(r'[<>:"/\\|?*]', '', filename) def clean_output_directory(output_dir: str) -> None: """出力ディレクトリを初期化""" # ディレクトリが存在する場合は削除して再作成 if os.path.exists(output_dir): shutil.rmtree(output_dir) os.makedirs(output_dir) def load_and_split_url(url_data: Dict[str, str]) -> List[Dict]: """URLからコンテンツを取得し、チャンク分割して保存""" try: # URLからドキュメントを取得 docs = WebBaseLoader(url_data["url"]).load() # テキスト分割設定 text_splitter = CharacterTextSplitter.from_tiktoken_encoder( separator="\n", chunk_size=2000, chunk_overlap=200, ) # ドキュメントを分割 splits = text_splitter.split_documents(docs) return [{ "title": url_data["title"], "content": doc.page_content, "index": i } for i, doc in enumerate(splits)] except Exception as e: print(f"Error processing {url_data['url']}: {str(e)}") return [] def save_chunk(chunk_data: Dict, output_dir: str) -> None: """チャンクをファイルに保存""" clean_title = clean_filename(chunk_data["title"]) filename = f"{clean_title}_{chunk_data['index']:03d}.txt" filepath = os.path.join(output_dir, filename) with open(filepath, "w", encoding="utf-8") as f: f.write(chunk_data["content"]) def main(): # URL一覧 urls = [ { "title": "【ファイルのプレフィクス】", "url": "【URL】" }, # 必要に応じて他のURLを追加 ] # 出力ディレクトリの初期化 output_dir = "output" print(f"Cleaning output directory: {output_dir}") clean_output_directory(output_dir) # 出力ディレクトリの作成 output_dir = "output" os.makedirs(output_dir, exist_ok=True) # 並列処理でURLからコンテンツを取得とチャンク分割 with ThreadPoolExecutor() as executor: chunks_list = list(executor.map(load_and_split_url, urls)) # フラット化 all_chunks = [chunk for chunks in chunks_list for chunk in chunks] # 並列処理でファイル保存 with ThreadPoolExecutor() as executor: executor.map( lambda chunk: save_chunk(chunk, output_dir), all_chunks ) if __name__ == "__main__": main()
実行結果
実行するとoutputディレクトリにチャンク化したテキストが入る。


コメント