تقسيم الرموز المميزة

يوجد حدود لنماذج اللغة. يجب ألا تتجاوز حد الرموز المميزة. لذلك، عند تقسيم النصوص إلى شظايا، من الأفضل أن تحسب عدد الرموز المستخدمة. هناك العديد من معالجي الرموز المتاحين. عند حساب عدد الرموز في النص، يجب استخدام نفس معالج الرموز المستخدم في نموذج اللغة.

يقدم هذا الفصل كيفية استخدام لانج تشين مختلف معالجات الرموز لتقسيم محتوى النصوص بناءً على الرموز المميزة.

tiktoken

تيكتوكن هو مُقسم BPE سريع مفتوح المصدر من OpenAI.

يمكننا استخدامه لتقدير عدد الرموز المستخدمة. قد يكون أكثر دقة لنماذج OpenAI.

  1. كيفية تقسيم النص: وفقًا للأحرف المُدخلة.
  2. كيفية قياس حجم الشظية: باستخدام مُقسم الرموز "تيكتوكن".
%pip install --upgrade --quiet langchain-text-splitters tiktoken
with open("../../../state_of_the_union.txt") as f:
    state_of_the_union = f.read()
	
from langchain_text_splitters import CharacterTextSplitter
text_splitter = CharacterTextSplitter.from_tiktoken_encoder(
    chunk_size=100, chunk_overlap=0
)
texts = text_splitter.split_text(state_of_the_union)
print(texts[0])
السيدة المتحدثة، السيدة نائبة الرئيس، سيدة الأولى والسيد الأخضر. أعضاء الكونغرس والحكومة. قضاة المحكمة العليا. زملاؤي الأمريكيين.  

    العام الماضي أبقى فيروس كوفيد-19 بيننا. هذا العام نحن معًا مرة أخرى. 
    
    هذه الليلة، نجتمع كديمقراطيين وجمهوريين ومستقلين. ولكن الأهم كأمريكيين. 
    
    بواجب نحو بعضنا البعض نحو الشعب الأمريكي نحو الدستور.

يمكن أن نحمل مُقسم تيكتوكن مباشرة أيضًا.

from langchain_text_splitters import TokenTextSplitter

text_splitter = TokenTextSplitter(chunk_size=10, chunk_overlap=0)

texts = text_splitter.split_text(state_of_the_union)
print(texts[0])

spaCy

سباسي هي مكتبة برمجيات مفتوحة المصدر لمعالجة اللغة الطبيعية المتقدمة مكتوبة بلغة Python وCython.

بدلاً من استخدام NLTK، يمكن استخدام مقسم الرموز "سباسي".

  1. كيفية تقسيم النص: باستخدام مُقسم "سباسي".
  2. كيفية قياس حجم الشظية: بعدد الأحرف.
with open("../../../state_of_the_union.txt") as f:
    state_of_the_union = f.read()
from langchain_text_splitters import SpacyTextSplitter

text_splitter = SpacyTextSplitter(chunk_size=1000)
texts = text_splitter.split_text(state_of_the_union)
print(texts[0])

SentenceTransformers

SentenceTransformersTokenTextSplitter هو مُقسم نص مصمم خصيصًا لنموذج تحويل الجمل. سلوكه الافتراضي هو تقسيم النص إلى مُجموعات من حجم نافذة الرمز المناسبة لنموذج تحويل الجمل المطلوب.

from langchain_text_splitters import SentenceTransformersTokenTextSplitter
splitter = SentenceTransformersTokenTextSplitter(chunk_overlap=0)
text = "لوريم "
count_start_and_stop_tokens = 2
text_token_count = splitter.count_tokens(text=text) - count_start_and_stop_tokens
print(text_token_count)
2
ضرب الرمز المضاعف = تقسيم الرمز الأقصى للشظية // عدد الرموز في النص + 1

النص المراد تقسيمه = النص * الرمز المضاعف

print(f"الرموز في النص المراد تقسيمه: {splitter.count_tokens(text=text_to_split)}")
الرموز في النص المراد تقسيمه: 514
الشظيات النصية = splitter.split_text(text=text_to_split)

print(text_chunks[1])
لوريم

مجموعة أدوات NLTK

مجموعة الأدوات اللغوية الطبيعية، المعروفة بشكل أكبر باسم NLTK، هي مجموعة من المكتبات والبرامج المخصصة لمعالجة اللغة الطبيعية، سواء كانت رمزية أو إحصائية، مكتوبة بلغة البرمجة Python، وتستخدم للغة الإنجليزية.

بدلاً من بسيطة تقسيم النص استنادًا إلى "\n\n"، يمكننا استخدام NLTK للتقسيم استنادًا إلى مقسم NLTK.

  1. طريقة تقسيم النص: باستخدام مقسم NLTK.
  2. قياس حجم القطعة: يتم قياسها بعدد الأحرف.
with open("../../../state_of_the_union.txt") as f:
    state_of_the_union = f.read()
from langchain_text_splitters import NLTKTextSplitter

text_splitter = NLTKTextSplitter(chunk_size=1000)
texts = text_splitter.split_text(state_of_the_union)
print(texts[0])

مقسم النصوص Hugging Face

تحتوي Hugging Face على العديد من المقسمات اللغوية.

نحن نستخدم مقسم النصوص GPT2TokenizerFast من مقسمات Hugging Face لحساب عدد الرموز في النص.

  1. كيفية تقسيم النص: يتم تقسيمه استنادًا إلى الأحرف المدخلة.
  2. كيفية حساب حجم القطعة: يتم قياسها بعدد الرموز المحسوبة بواسطة مقسم النصوص من Hugging Face.
from transformers import GPT2TokenizerFast

tokenizer = GPT2TokenizerFast.from_pretrained("gpt2")
with open("../../../state_of_the_union.txt") as f:
    state_of_the_union = f.read()

from langchain_text_splitters import CharacterTextSplitter
text_splitter = CharacterTextSplitter.from_huggingface_tokenizer(
    tokenizer, chunk_size=100, chunk_overlap=0
)
texts = text_splitter.split_text(state_of_the_union)
print(texts[0])