Phase 05: NLP: Foundations to Advanced

پردازش متن نشان دادن، انتخاب، لمیت سازی

زبان ادامه دارد، مدل ها متمایز هستند، پردازش پیش از انجام، پل است.

Type: Build

Languages: Python

Prerequisites: Phase 2 · 14 (Naive Bayes)

Time: ~45 minutes

مشکل

يه مدل نميتونه " گربه ها دوچرخه رو مي خوانند "

هر سیستم NLP با سه سوال مشابه آغاز می شود. یک کلمه از کجا شروع می شود. ریشه کلمه چیست. چگونه با "جنگ"، "جنگ"، "جنگ" به عنوان یک چیز در صورتی که کمک می کند، و به عنوان چیزهای متفاوت در صورتی که کمک نمی کند، رفتار می کنیم؟

اگه توکنيزيشن اشتباه بشه مدل از زباله ياد ميگيردdon'tبه عنوان یک نشانه اماdo n'tدو تا، توزیع آموزش تقسیم می شود.organizationوorganاگر لمیتیزر شما به یک بخش از زمینه گفتار نیاز دارد اما شما آن را به دست نمی آورید، فعل ها به عنوان اسم ها در نظر گرفته می شوند.

این درس سه مرحله پیش پردازش را از ابتدا می سازد، سپس نشان می دهد که چگونه NLTK و spaCy کار مشابهی را انجام می دهند تا بتوانید معامله را ببینید.

مفهوم

سه عملیات هر کدام یک شغل و یک حالت شکست دارند

Tokenization"توکین" عمدا مبهم است زیرا غلظت درست بستگی به کار دارد. سطح کلمه برای NLP کلاسیک. زیر کلمه برای ترانسفورماتورها. شخصیت برای زبان های بدون فضای سفید.

Stemming.کارت ها با قوانين هاrunning -> run.organization -> organ. اون دومين حالت شکست

Lemmatizationیک کلمه را به شکل لغت خود با استفاده از دانش گرامر کاهش می دهد. آهسته تر، دقیق تر، نیاز به یک جدول جستجو یا تحلیلگر مورفولوژیکی دارد. ran -> run(بايد بدونم "رن" زمان گذشته "رن"ه)better -> good(به نیاز به دانستن فرم های مقایسه ای)

قاعده انگشت. وقتی سرعت مهم است و می توانید شور را تحمل کنید (درخشش جستجو، طبقه بندی خشن). وقتی معنی مهم است (پاسخ دادن به سوال، جستجوی معنوی، هر چیزی که کاربر می خواند) ، لیماتیز کنید.

آن را بسازید

مرحله اول: یک رمزنگاری کننده کلمه regex

ساده ترین توکنيزر مفید به صورت حروف غیر الفانومری تقسیم می شود و در عین حال نقطه بندی را به عنوان توکن های خود حفظ می کند. کامل نیست، نه نهایی، اما در یک خط اجرا می شود.

pythonimport re

def tokenize(text):
    return re.findall(r"[A-Za-z]+(?:'[A-Za-z]+)?|[0-9]+|[^\sA-Za-z0-9]", text)

سه الگوی در ترتیب اولویت.don't،it's) اعداد خالص. هر یک از غیر فضای سفید غیر الفانومریک به عنوان یک نماد مستقل (نقطه بندی).

python>>> tokenize("The cats weren't running at 3pm.")
['The', 'cats', "weren't", 'running', 'at', '3', 'pm', '.']

حالت شکست برای تشخیص3pmبه قسمت دوم تقسیم می شه['3', 'pm']چون ما بین خطوط و اعداد متناوب بودیم. برای اکثر کارها کافی است. URL ها، ایمیل ها، هشتگ ها همه شکسته می شوند. برای تولید، قبل از الگوهای عمومی، الگوهای اضافه شده را اضافه کنید.

مرحله دوم: یک پورتر stemmer (تنها مرحله 1a)

الگوریتم پورتر کامل دارای پنج مرحله از قوانین است. مرحله 1a تنها شامل شایع ترین ضمیر های انگلیسی و الگوی را آموزش می دهد.

pythondef stem_step_1a(word):
    if word.endswith("sses"):
        return word[:-2]
    if word.endswith("ies"):
        return word[:-2]
    if word.endswith("ss"):
        return word
    if word.endswith("s") and len(word) > 1:
        return word[:-1]
    return word
python>>> [stem_step_1a(w) for w in ["caresses", "ponies", "caress", "cats"]]
['caress', 'poni', 'caress', 'cat']

قوانین رو از بالا تا پایین بخونیدies -> iقانون اينه که چراponies -> poniنهpony.پورتر واقعي قدم اول ب رو داره که ميخواد درستش کنه قوانين رقابت ميکنه قوانين قبلی برنده ميشه

مرحله سوم: یک لمیتیزر مبتنی بر جستجو

لمیتاسیون مناسب نیاز به مورفولوژی دارد. یک نسخه آموزشی قابل کنترل از یک جدول لمی کوچک و یک عقب نشینی استفاده می کند.

pythonLEMMA_TABLE = {
    ("running", "VERB"): "run",
    ("ran", "VERB"): "run",
    ("runs", "VERB"): "run",
    ("better", "ADJ"): "good",
    ("best", "ADJ"): "good",
    ("cats", "NOUN"): "cat",
    ("cat", "NOUN"): "cat",
    ("were", "VERB"): "be",
    ("was", "VERB"): "be",
    ("is", "VERB"): "be",
}

def lemmatize(word, pos):
    key = (word.lower(), pos)
    if key in LEMMA_TABLE:
        return LEMMA_TABLE[key]
    if pos == "VERB" and word.endswith("ing"):
        return word[:-3]
    if pos == "NOUN" and word.endswith("s"):
        return word[:-1]
    return word.lower()
python>>> lemmatize("running", "VERB")
'run'
>>> lemmatize("cats", "NOUN")
'cat'
>>> lemmatize("better", "ADJ")
'good'
>>> lemmatize("watched", "VERB")
'watched'

آخرین مورد، لحظه ی کلیدی آموزش است.watchedاون توي ميزمون نيست و عقب نشيني ما فقط دستش رو ميگيرهing. لمیتیزاسیون واقعی پوشش میدهed، فعل های نامنظم، صفت های مقایسه ای، جمع بندی با تغییر صوتی (children -> child) به همین دلیل سیستم های تولید از WordNet، مورفولوژیک اسپاسی یا یک تحلیلگر مورفولوژیک کامل استفاده می کنند.

مرحله 4: آنها را به هم ببندید

pythondef preprocess(text, pos_tagger=None):
    tokens = tokenize(text)
    stems = [stem_step_1a(t.lower()) for t in tokens]
    tags = pos_tagger(tokens) if pos_tagger else [(t, "NOUN") for t in tokens]
    lemmas = [lemmatize(word, pos) for word, pos in tags]
    return {"tokens": tokens, "stems": stems, "lemmas": lemmas}

قطعه گمشده یک برچسب POS است. مرحله 5 · 07 (POS Tagging) یک را ایجاد می کند. برای حال، همه چیز به طور پیش فرض به NOUNو محدودیت ها رو بپذیری

ازش استفاده کن

NLTK و spaCy نسخه های تولید رو میفرستن چند خط هر کدام

NLTK

pythonimport nltk
nltk.download("punkt_tab")
nltk.download("wordnet")
nltk.download("averaged_perceptron_tagger_eng")

from nltk.tokenize import word_tokenize
from nltk.stem import PorterStemmer, WordNetLemmatizer
from nltk import pos_tag

text = "The cats were running."
tokens = word_tokenize(text)
stems = [PorterStemmer().stem(t) for t in tokens]
lemmatizer = WordNetLemmatizer()
tagged = pos_tag(tokens)


def nltk_pos_to_wordnet(tag):
    if tag.startswith("V"):
        return "v"
    if tag.startswith("J"):
        return "a"
    if tag.startswith("R"):
        return "r"
    return "n"


lemmas = [lemmatizer.lemmatize(t, nltk_pos_to_wordnet(tag)) for t, tag in tagged]

word_tokenize.معاملات انقباضات، یونیکود، موارد حاشيه که ريگکس شما از دست ميدهPorterStemmerتمام پنج مرحله رو اجرا مي کنهWordNetLemmatizerنیاز به برچسب POS ترجمه از طرح Penn Treebank NLTK به مجموعه اختصار WordNet. سیم کشی ترجمه بالا کمی بیشتر آموزش ها از دست می دهد.

اسپاسی

pythonimport spacy

nlp = spacy.load("en_core_web_sm")
doc = nlp("The cats were running.")

for token in doc:
    print(token.text, token.lemma_, token.pos_)
The      the     DET
cats     cat     NOUN
were     be      AUX
running  run     VERB
.        .       PUNCT

اسپاساي کل خط لوله رو پشت سرش پنهان ميکنهnlp(text). توکن سازی، برچسب گذاری POS و لمیتاسیون همه اجرا می شوند. سریعتر از NLTK در مقیاس. دقیق تر از جعبه. معامله این است که شما نمی توانید به راحتی متبادله قطعات فردی.

چه وقت انتخاب کن

SituationPick
Teaching, research, swapping componentsNLTK
Production, multi-language, speed mattersspaCy
Transformer pipeline (you'll tokenize with the model's tokenizer anyway)Use tokenizers / transformers and skip classical preprocessing

دو حالت شکست هیچ کس شما را در مورد هشدار نمی دهد

بیشتر آموزش ها الگوریتم ها را آموزش می دهند و متوقف می شوند. دو چیز یک خط لوله پیش پردازش واقعی را می خندندند و تقریبا هرگز پوشش داده نمی شوند.

Reproducibility drift.NLTK و spaCy تغییر نشان دادن و رفتار lemmatizer بین نسخه ها.['do', "n't"]در spaCy 2.x ممکن است تولید کند["don't"]در 3.x مدل شما در یک توزیع آموزش دیده است. الان تعبیر در یک توزیع دیگر اجرا می شود. دقت به آرامی کاهش می یابد و هیچ کس نمی داند چرا. نسخه های کتابخانه پین درrequirements.txt. يه تست بازپسين پيش از پردازش بنويسيد که نشاني هاي انتظار شده 20 جمله نمونه اي را منجمد کنه

Training / inference mismatch.آموزش با پردازش پیشگیری (کتابی کوچک، حذف کلمات متوقف، استیمینگ) ، استفاده از ورودی خام کاربر، کرتر عملکرد ساعت. این تنها شکست NLP تولید رایج است. اگر شما در طول آموزش پیش پردازش، شما باید عملکرد مشابه را در طول نتیجه گیری اجرا کنید. پیش پردازش را به عنوان یک عملکرد در داخل بسته مدل ارسال کنید، نه به عنوان یک سلول نوت بوک که تیم خدمت کننده دوباره می نویسد.

-باده

یک پیامک قابل استفاده مجدد که به مهندسان کمک می کند بدون خواندن سه کتاب درسی یک استراتژی پیش پردازش را انتخاب کنند.

پس ازoutputs/prompt-preprocessing-advisor.md:

markdown---
name: preprocessing-advisor
description: Recommends a tokenization, stemming, and lemmatization setup for an NLP task.
phase: 5
lesson: 01
---

You advise on classical NLP preprocessing. Given a task description, you output:

1. Tokenization choice (regex, NLTK word_tokenize, spaCy, or transformer tokenizer). Explain why.
2. Whether to stem, lemmatize, both, or neither. Explain why.
3. Specific library calls. Name the functions. Quote the POS-tag translation if NLTK is involved.
4. One failure mode the user should test for.

Refuse to recommend stemming for user-visible text. Refuse to recommend lemmatization without POS tags. Flag non-English input as needing a different pipeline.

تمرینات

  1. Easy.طولانيtokenizeبرای نگه داشتن URL ها به عنوان توکن های تک. آزمون: tokenize("Visit https://example.com today.")باید یک توکن URL تولید کند.
  2. Medium.مرحله 1ب را اجرا کنید. اگر یک کلمه حاوی یک صوتی باشد و به edیاing، ازش کن.hopping -> hopنهhopp)
  3. Hard.یک lemmatizer بسازید که از WordNet به عنوان یک جدول جستجو استفاده می کند اما وقتی WordNet هیچ ورودی ندارد به رای پورتر شما برمی گردد. دقت را در یک کورپوس برچسب شده با WordNet و Porter ساده اندازه گیری کنید.

اصطلاحات کلیدی

TermWhat people sayWhat it actually means
TokenA wordWhatever unit the model consumes. Can be word, subword, character, or byte.
StemRoot of a wordResult of rule-based suffix stripping. Not always a real word.
LemmaDictionary formThe form you'd look up. Requires grammatical context to compute correctly.
POS tagPart of speechCategory like NOUN, VERB, ADJ. Needed to lemmatize accurately.
MorphologyWord shape rulesHow a word changes form based on tense, number, case. Lemmatization depends on it.

خواندن بیشتر

This free lesson is part of the AI Engineering from Scratch curriculum. Read the full explanation, run the lesson code, and verify the result in the interactive reader or from the repository source.

Browse the complete course catalog or open this lesson on GitHub.