ใƒกใ‚คใƒณใ‚ณใƒณใƒ†ใƒณใƒ„ใธใ‚นใ‚ญใƒƒใƒ—
่ฆ‹ๅ‡บใ—็”ปๅƒ

LangChainใฎTextSplitterใ‚’่ฉฆใ™

    ใ€ŒLangChainใ€ใฎใ€ŒTextSplitterใ€ใŒใƒ†ใ‚ญใ‚นใƒˆใ‚’ใฉใฎใ‚ˆใ†ใซๅˆ†ๅ‰ฒใ™ใ‚‹ใ‹ใ‚’ใพใจใ‚ใพใ—ใŸใ€‚

    ๅ‰ๅ›ž

    1. TextSplitter

    ใ€ŒTextSplitterใ€ใฏ้•ทใ„ใƒ†ใ‚ญใ‚นใƒˆใ‚’ใƒใƒฃใƒณใ‚ฏใซๅˆ†ๅ‰ฒใ™ใ‚‹ใŸใ‚ใฎใ‚ฏใƒฉใ‚นใงใ™ใ€‚
    ๅ‡ฆ็†ใฎๆตใ‚Œใฏใ€ๆฌกใฎใจใŠใ‚Šใงใ™ใ€‚

    (1) ใ‚ปใƒ‘ใƒฌใƒผใ‚ฟ(ใƒ‡ใƒ•ใ‚ฉใƒซใƒˆใฏ"\n\n")ใงใ€ใƒ†ใ‚ญใ‚นใƒˆใ‚’ๅฐใ•ใชใƒใƒฃใƒณใ‚ฏใซๅˆ†ๅ‰ฒใ€‚
    (2) ๅฐใ•ใชใƒใƒฃใƒณใ‚ฏใ‚’็‰นๅฎšใ‚ตใ‚คใ‚บใซใชใ‚‹ใพใงใƒžใƒผใ‚ธใ—ใ€ๅคงใใชใƒใƒฃใƒณใ‚ฏใ‚’ไฝœๆˆใ€‚

    2. CharacterTextSplitter

    ใ‚ปใƒ‘ใƒฌใƒผใ‚ฟใงๅˆ†ๅ‰ฒใ—ใฆใ€ๆ–‡ๅญ—ๆ•ฐใงใƒžใƒผใ‚ธใ™ใ‚‹TextSplitterใงใ™ใ€‚

    from langchain.text_splitter import CharacterTextSplitter
    text_splitter = CharacterTextSplitter(
        separator = "\n\n",  # ใ‚ปใƒ‘ใƒฌใƒผใ‚ฟ
        chunk_size = 11,  # ใƒใƒฃใƒณใ‚ฏใฎๆ–‡ๅญ—ๆ•ฐ
        chunk_overlap = 0,  # ใƒใƒฃใƒณใ‚ฏใ‚ชใƒผใƒใƒผใƒฉใƒƒใƒ—ใฎๆ–‡ๅญ—ๆ•ฐ
    )

    ใ‚ปใƒ‘ใƒฌใƒผใ‚ฟใชใ—ใฎใƒ†ใ‚ญใ‚นใƒˆใฏๅˆ†ๅ‰ฒใ•ใ‚Œใพใ›ใ‚“ใ€‚

    print(text_splitter.split_text("ใ‚ใ„ใ†ใˆใŠใ‹ใใใ‘ใ“ใ•ใ—ใ™ใ›ใใ‚„ใ‚†ใ‚ˆใ‚ใ‚’ใ‚“"))
    ['ใ‚ใ„ใ†ใˆใŠใ‹ใใใ‘ใ“ใ•ใ—ใ™ใ›ใใ‚„ใ‚†ใ‚ˆใ‚ใ‚’ใ‚“']

    ใ‚ปใƒ‘ใƒฌใƒผใ‚ฟใฎใ‚ใ‚Šใงใƒใƒฃใƒณใ‚ฏใฎๆ–‡ๅญ—ๆ•ฐใ‚’11ใซใ™ใ‚‹ใจใ€ๆฌกใฎใ‚ˆใ†ใซๅˆ†ๅ‰ฒใ•ใ‚Œใพใ™ใ€‚
    10ใซใ™ใ‚‹ใจใ€Œใ‚ใ„ใ†ใˆใŠ\n\nใ‹ใใใ‘ใ“ใ€ใŒใ‚ปใƒƒใƒˆใซใชใ‚Šใพใ›ใ‚“ใ€‚
    (ใ‚ปใƒ‘ใƒฌใƒผใ‚ฟใฏ1ๆ–‡ๅญ—ใจใ‚ซใ‚ฆใƒณใƒˆใ•ใ‚Œใฆใ‚‹๏ผŸ)

    print(text_splitter.split_text("ใ‚ใ„ใ†ใˆใŠ\n\nใ‹ใใใ‘ใ“\n\nใ•ใ—ใ™ใ›ใ\n\nใ‚„ใ‚†ใ‚ˆ\n\nใ‚ใ‚’ใ‚“"))
    ['ใ‚ใ„ใ†ใˆใŠ\n\nใ‹ใใใ‘ใ“', 'ใ•ใ—ใ™ใ›ใ\n\nใ‚„ใ‚†ใ‚ˆ\n\nใ‚ใ‚’ใ‚“']

    ใƒใƒฃใƒณใ‚ฏใ‚ชใƒผใƒใƒผใƒฉใƒƒใƒ—ใฎๆ–‡ๅญ—ๆ•ฐใ‚’5ใซใ™ใ‚‹ใจใ€ๆฌกใฎใ‚ˆใ†ใซๅˆ†ๅ‰ฒใ•ใ‚Œใพใ™ใ€‚
    ใ€Œใ‹ใใใ‘ใ“ใ€ใชใฉใƒใƒฃใƒณใ‚ฏๅ˜ไฝใงใ‚ชใƒผใƒใƒผใƒฉใƒƒใƒ—ใ•ใ‚Œใฆใ„ใพใ™ใ€‚

    print(text_splitter.split_text("ใ‚ใ„ใ†ใˆใŠ\n\nใ‹ใใใ‘ใ“\n\nใ•ใ—ใ™ใ›ใ\n\nใ‚„ใ‚†ใ‚ˆ\n\nใ‚ใ‚’ใ‚“"))
    ['ใ‚ใ„ใ†ใˆใŠ\n\nใ‹ใใใ‘ใ“', 'ใ‹ใใใ‘ใ“\n\nใ•ใ—ใ™ใ›ใ', 'ใ•ใ—ใ™ใ›ใ\n\nใ‚„ใ‚†ใ‚ˆ', 'ใ‚„ใ‚†ใ‚ˆ\n\nใ‚ใ‚’ใ‚“']

    3. RecursiveCharacterTextSplitter

    ใƒใƒฃใƒณใ‚ฏใ‚ตใ‚คใ‚บใฎๅˆถ้™ใ‚’ไธ‹ๅ›žใ‚‹ใพใงๅ†ๅธฐ็š„ใซๅˆ†ๅ‰ฒใ™ใ‚‹TextSplitterใงใ™ใ€‚

    from langchain.text_splitter import RecursiveCharacterTextSplitter
    text_splitter = RecursiveCharacterTextSplitter(
        chunk_size = 11,   # ใƒใƒฃใƒณใ‚ฏใฎๆ–‡ๅญ—ๆ•ฐ
        chunk_overlap  = 0,  # ใƒใƒฃใƒณใ‚ฏใ‚ชใƒผใƒใƒผใƒฉใƒƒใƒ—ใฎๆ–‡ๅญ—ๆ•ฐ
    )

    ใ‚ปใƒ‘ใƒฌใƒผใ‚ฟใฎใชใ„ใƒ†ใ‚ญใ‚นใƒˆใ‚‚ๅˆ†ๅ‰ฒใงใใพใ™ใ€‚
    (ใƒใƒฃใƒณใ‚ฏใฎๆ–‡ๅญ—ๆ•ฐ11ใ ใ‘ใฉ9ๆ–‡ๅญ—ใงๅˆ†ๅ‰ฒ๏ผŸ)

    print(text_splitter.split_text("ใ‚ใ„ใ†ใˆใŠใ‹ใใใ‘ใ“ใ•ใ—ใ™ใ›ใใ‚„ใ‚†ใ‚ˆใ‚ใ‚’ใ‚“"))
    ['ใ‚ใ„ใ†ใˆใŠใ‹ใใใ‘', 'ใ“ใ•ใ—ใ™ใ›ใใ‚„ใ‚†ใ‚ˆ', 'ใ‚ใ‚’ใ‚“']

    ใƒใƒฃใƒณใ‚ฏใ‚ชใƒผใƒใƒผใƒฉใƒƒใƒ—ใฎๆ–‡ๅญ—ๆ•ฐใ‚’5ใซใ™ใ‚‹ใจใ€ๆฌกใฎใ‚ˆใ†ใซๅˆ†ๅ‰ฒใ•ใ‚Œใพใ™ใ€‚
    ใ€Œใ‹ใใใ‘ใ“ใ€ใชใฉ5ๆ–‡ๅญ—ๅ˜ไฝใงใ‚ชใƒผใƒใƒผใƒฉใƒƒใƒ—ใ•ใ‚Œใฆใ„ใพใ™ใ€‚

    print(text_splitter.split_text("ใ‚ใ„ใ†ใˆใŠใ‹ใใใ‘ใ“ใ•ใ—ใ™ใ›ใใ‚„ใ‚†ใ‚ˆใ‚ใ‚’ใ‚“"))
    ['ใ‚ใ„ใ†ใˆใŠใ‹ใใใ‘ใ“', 'ใ‹ใใใ‘ใ“ใ•ใ—ใ™ใ›ใ', 'ใ•ใ—ใ™ใ›ใใ‚„ใ‚†ใ‚ˆใ‚ใ‚’', 'ใ‚„ใ‚†ใ‚ˆใ‚ใ‚’ใ‚“']

    4. tiktoken (OpenAI) Length Function

    OpenAIใฎใƒˆใƒผใ‚ฏใƒŠใ‚คใ‚ถใƒผใซใ‚ˆใ‚‹TextSplitterใงใ™ใ€‚

    text_splitter = CharacterTextSplitter.from_tiktoken_encoder(
        separator = "\n\n",  # ใ‚ปใƒ‘ใƒฌใƒผใ‚ฟ
        chunk_size=14,  # ใƒใƒฃใƒณใ‚ฏใฎใƒˆใƒผใ‚ฏใƒณๆ•ฐ
        chunk_overlap=0  # ใƒใƒฃใƒณใ‚ฏใ‚ชใƒผใƒใƒผใƒฉใƒƒใƒ—ใฎใƒˆใƒผใ‚ฏใƒณๆ•ฐ
    )

    ใฏใ˜ใ‚ใซใ€ใ‚ปใƒ‘ใƒฌใƒผใ‚ฟๅˆ†ๅ‰ฒใ—ใŸๅฐใ•ใ„ใƒใƒฃใƒณใ‚ฏใฎใƒˆใƒผใ‚ฏใƒณๆ•ฐใ‚’็ขบ่ชใ—ใพใ™ใ€‚

    import tiktoken
    enc = tiktoken.get_encoding("gpt2")
    
    print(len(enc.encode("ใ‚ใ„ใ†ใˆใŠ")))
    print(len(enc.encode("ใ‹ใใใ‘ใ“")))
    print(len(enc.encode("ใ•ใ—ใ™ใ›ใ")))
    print(len(enc.encode("ใ‚„ใ‚†ใ‚ˆ")))
    print(len(enc.encode("ใ‚ใ‚’ใ‚“")))
    7
    6
    7
    6
    4

    ใ‚ปใƒ‘ใƒฌใƒผใ‚ฟใชใ—ใฎใƒ†ใ‚ญใ‚นใƒˆใฏๅˆ†ๅ‰ฒใ•ใ‚Œใพใ›ใ‚“ใ€‚

    print(text_splitter.split_text("ใ‚ใ„ใ†ใˆใŠใ‹ใใใ‘ใ“ใ•ใ—ใ™ใ›ใใ‚„ใ‚†ใ‚ˆใ‚ใ‚’ใ‚“"))
    ['ใ‚ใ„ใ†ใˆใŠใ‹ใใใ‘ใ“ใ•ใ—ใ™ใ›ใใ‚„ใ‚†ใ‚ˆใ‚ใ‚’ใ‚“']

    ใ‚ปใƒ‘ใƒฌใƒผใ‚ฟใฎใ‚ใ‚Šใงใƒใƒฃใƒณใ‚ฏใฎใƒˆใƒผใ‚ฏใƒณๆ•ฐใ‚’11ใซใ™ใ‚‹ใจใ€ๆฌกใฎใ‚ˆใ†ใซๅˆ†ๅ‰ฒใ•ใ‚Œใพใ™ใ€‚

    print(text_splitter.split_text("ใ‚ใ„ใ†ใˆใŠ\n\nใ‹ใใใ‘ใ“\n\nใ•ใ—ใ™ใ›ใ\n\nใ‚„ใ‚†ใ‚ˆ\n\nใ‚ใ‚’ใ‚“"))
    ['ใ‚ใ„ใ†ใˆใŠ\n\nใ‹ใใใ‘ใ“', 'ใ•ใ—ใ™ใ›ใ\n\nใ‚„ใ‚†ใ‚ˆ', 'ใ‚ใ‚’ใ‚“']

    ใƒใƒฃใƒณใ‚ฏใ‚ชใƒผใƒใƒผใƒฉใƒƒใƒ—ใฎๆ–‡ๅญ—ๆ•ฐใ‚’6ใซใ™ใ‚‹ใจใ€ๆฌกใฎใ‚ˆใ†ใซๅˆ†ๅ‰ฒใ•ใ‚Œใพใ™ใ€‚
    ใ€Œใ‹ใใใ‘ใ“ใ€ใฏ6ใƒˆใƒผใ‚ฏใƒณใชใฎใงใ‚ชใƒผใƒใƒผใƒฉใƒƒใƒ—ใ•ใ‚Œใ€ใ€Œใ•ใ—ใ™ใ›ใใ€ใฏ7ใƒˆใƒผใ‚ฏใƒณใชใฎใงใ‚ชใƒผใƒใƒผใƒฉใƒƒใƒ—ใ•ใ‚Œใพใ›ใ‚“ใ€‚

    print(text_splitter.split_text("ใ‚ใ„ใ†ใˆใŠ\n\nใ‹ใใใ‘ใ“\n\nใ•ใ—ใ™ใ›ใ\n\nใ‚„ใ‚†ใ‚ˆ\n\nใ‚ใ‚’ใ‚“"))
    ['ใ‚ใ„ใ†ใˆใŠ\n\nใ‹ใใใ‘ใ“', 'ใ‹ใใใ‘ใ“\n\nใ•ใ—ใ™ใ›ใ', 'ใ‚„ใ‚†ใ‚ˆ\n\nใ‚ใ‚’ใ‚“']

    ใใฎไป–ใฎTextSplitter

    ใใฎไป–ใฎTextSplitterใฏใ€ๆฌกใฎใจใŠใ‚Šใงใ™ใ€‚

    4.1 HuggingFace Length Function

    HuggingFaceใฎใƒˆใƒผใ‚ฏใƒŠใ‚คใ‚ถใƒผใซใ‚ˆใ‚‹TextSplitterใงใ™ใ€‚

    text_splitter = CharacterTextSplitter.from_huggingface_tokenizer(
        GPT2TokenizerFast.from_pretrained("gpt2"),
        chunk_size=100,  # ใƒใƒฃใƒณใ‚ฏใฎใƒˆใƒผใ‚ฏใƒณๆ•ฐ
        chunk_overlap=0  # ใƒใƒฃใƒณใ‚ฏใ‚ชใƒผใƒใƒผใƒฉใƒƒใƒ—ใฎใƒˆใƒผใ‚ฏใƒณๆ•ฐ
    )

    4.2 NLTKTextSplitter

    NLTKใซใ‚ˆใ‚‹TextSplitterใงใ™ใ€‚

    from langchain.text_splitter import NLTKTextSplitter
    text_splitter = NLTKTextSplitter(
        chunk_size=1000  # ใƒใƒฃใƒณใ‚ฏใฎใƒˆใƒผใ‚ฏใƒณๆ•ฐ
    )

    4.3 SpacyTextSplitter

    Spacyใซใ‚ˆใ‚‹TextSplitterใงใ™ใ€‚

    from langchain.text_splitter import SpacyTextSplitter
    text_splitter = SpacyTextSplitter(
        chunk_size=1000  # ใƒใƒฃใƒณใ‚ฏใฎใƒˆใƒผใ‚ฏใƒณๆ•ฐ
    )

    ้–ข้€ฃ

    ๆฌกๅ›ž



    ย 
    ย 

    npaka

    ย 
    ย 
    ใƒ—ใƒญใ‚ฐใƒฉใƒžใƒผใ€‚iPhone / Android / Unity / ROS / AI / AR / VR / RasPi / ใƒญใƒœใƒƒใƒˆ / ใ‚ฌใ‚ธใ‚งใƒƒใƒˆใ€‚ๅนด2ๅ†Šใƒšใƒผใ‚นใงๆŠ€่ก“ๆ›ธใ‚’ๅŸท็ญ†ใ€‚ใ‚ขใƒ‹ใ‚ฝใƒณ / ใ‚ซใƒฉใ‚ชใ‚ฑ / ใ‚ฎใ‚ฟใƒผ / ็Œซ twitter : @npaka123

    ใ‚ใชใŸใธใฎใŠใ™ใ™ใ‚