見出し画像

最高のテキストチャンクング方法とは?

本記事については生成AIを活用して生成された記事となります。解説内容の正確性については読者ご自身でご確認いただきますようお願いいたします。

本記事はThe Best Text Chunking Method? · Hasan Aboul Hasan · Mediumの解説記事となります。

テキストチャンクング(またはテキストスプリッティング)は、大きなテキストを小さな部分に分割する方法です。教育やデータの整理、複雑な概念の理解など、人間が情報を処理しやすくするために使用されます。また、プログラミングの分野では、テキスト分析やAI、RAG(Retrieval-Augmented Generation)などで重要な役割を果たします。

テキストチャンクングの基本

チャンクングの目的

チャンクングは、情報を迅速かつ正確に取得するために、外部データを小さなチャンクに分割する方法です。これにより、AIモデルが特定の情報を効率的に検索し、より正確な結果を生成することができます。

チャンクングの方法

各種チャンクング手法の概要

  • 文字単位:テキストを個々の文字に分割します。深いテキスト分析が必要な場合に有用です。

  • トークン単位:単語やサブワードなどのトークンに分割します。自然言語処理で一般的です。

  • 段落単位:段落ごとに分割し、テキストの構造を維持します。

  • 再帰的チャンクング:データを階層的に小さなチャンクに分割します。

  • セマンティックチャンクング:意味に基づいてテキストをグループ化し、データの文脈を理解するタスクに不可欠です。

  • エージェントチャンクング:人や組織などのエージェントに基づいてテキストをグループ化します。

セマンティックチャンクングの動作原理

セマンティックチャンクングは、テキストを意味の類似性に基づいて分割する方法です。テキストをベクトル埋め込みに変換し、コサイン類似度を計算して、しきい値を超える部分で分割します。

セマンティックチャンクングの実装例

以下のコードは、セマンティックチャンクングのプロトタイプを示しています。

import re
import openai
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity

def chunk_text(text):
    single_sentences_list = _split_sentences(text)
    combined_sentences = _combine_sentences(single_sentences_list)
    embeddings = convert_to_vector(combined_sentences)
    distances = _calculate_cosine_distances(embeddings)
    breakpoint_percentile_threshold = 80
    breakpoint_distance_threshold = np.percentile(distances, breakpoint_percentile_threshold)
    indices_above_thresh = [i for i, distance in enumerate(distances) if distance > breakpoint_distance_threshold]
    chunks = []
    start_index = 0
    for index in indices_above_thresh:
        chunk = ' '.join(single_sentences_list[start_index:index+1])
        chunks.append(chunk)
        start_index = index + 1
    if start_index < len(single_sentences_list):
        chunk = ' '.join(single_sentences_list[start_index:])
        chunks.append(chunk)
    return chunks

def _split_sentences(text):
    sentences = re.split(r'(?<=[.?!])\s+', text)
    return sentences

def _combine_sentences(sentences):
    combined_sentences = []
    for i in range(len(sentences)):
        combined_sentence = sentences[i]
        if i > 0:
            combined_sentence = sentences[i-1] + ' ' + combined_sentence
        if i < len(sentences) - 1:
            combined_sentence += ' ' + sentences[i+1]
        combined_sentences.append(combined_sentence)
    return combined_sentences

def convert_to_vector(texts):
    try:
        response = openai.embeddings.create(
            input=texts,
            model="text-embedding-3-small"
        )
        embeddings = np.array([item.embedding for item in response.data])
        return embeddings
    except Exception as e:
        print("An error occurred:", e)
        return np.array([])

def _calculate_cosine_distances(embeddings):
    distances = []
    for i in range(len(embeddings) - 1):
        similarity = cosine_similarity([embeddings[i]], [embeddings[i + 1]])[0][0]
        distance = 1 - similarity
        distances.append(distance)
    return distances

text = """Your_Input_Text"""
chunks = chunk_text(text)
print("Chunks:", chunks)

ライブラリを使用したセマンティックチャンクング

使用可能なライブラリ

  • LangChain:自然言語理解を強化するセマンティックチャンクング機能を提供します。

  • Llama Index:大規模な言語モデルの効率的なインデックス作成と検索機能を提供します。

  • SimplerLLM:今後追加予定のセマンティックチャンクング機能を提供します。

まとめ

テキストチャンクングは、情報の検索と分析を効率化する重要な手法です。特にセマンティックチャンクングは、データの文脈理解において非常に有用です。適切なチャンクング方法を選ぶことで、AIモデルの精度と効率を大幅に向上させることができます。

#生成AI