தர்க்கக் கோட்டையிலிருந்து உணர்வுகளின் உலகிற்கு இயந்திரங்களின் பயணம்.
இயல் மொழி தெளிதல் (Natural Language Processing - NLP) - ஒரு அறிமுகம்.
Interactive Python Examples · Live Code Execution
Use Spacebar or Arrow Keys to navigate
↓ Scroll down for more in this chapter ↓
வார்த்தைகள் அவற்றின் சூழலைப் (Context) பொறுத்து வெவ்வேறு அர்த்தங்களைத் தரும்.
"He saw the bat." - இதில் 'bat' என்றால் என்ன?
NLP-இன் வெற்றி: வெறும் வார்த்தைகளைப் படிப்பது மட்டுமல்ல, அவை பயன்படுத்தப்படும் சூழலை உள்வாங்குவதே உண்மையான நுண்ணறிவு.
ஒரு நீளமான வாக்கியத்தை, கணினிக்குப் புரியும் சிறிய, அர்த்தமுள்ள துண்டுகளாக (Tokens) வெட்டும் முதல் படி.
எடுத்துக்காட்டு: "நல்வரவு! உங்கள் பெயர் என்ன?"
Tokens: ["நல்வரவு", "!", "உங்கள்", "பெயர்", "என்ன", "?"]
முழு வார்த்தையாகவோ, தனி எழுத்தாகவோ பிரிக்காமல், அடிக்கடி வரும் எழுத்துச் சேர்க்கைகளை (Subwords) பிரிக்கும் நவீன முறை. GPT, BERT போன்ற LLM-களின் ரகசியம் இதுவே.
எடுத்துக்காட்டு: "Unhappiness"
Tokens: ["Un", "happi", "ness"]
(NLTK WordPunctTokenizer & PunktSentenceTokenizer)
from nltk.tokenize import WordPunctTokenizer, PunktSentenceTokenizer
text = "Welcome to NLP! What is your name?"
# NLTK Tokenizers - no data download needed
word_tok = WordPunctTokenizer()
sent_tok = PunktSentenceTokenizer()
# வார்த்தைகளாகப் பிரிக்க (Word Tokenization)
words = word_tok.tokenize(text)
print("Words:", words)
# வாக்கியங்களாகப் பிரிக்க (Sentence Tokenization)
sentences = sent_tok.tokenize(text)
print("Sentences:", sentences)
print("\n💡 NLTK Tokenizers: data download இல்லாமல் இயங்கும்!")
இடைவெளி (Space) மட்டுமே எல்லா மொழிகளுக்கும் தீர்வாகாது!
வாக்கியத்தின் மையக் கருத்திற்குப் பங்களிக்காத, இலக்கண இணைப்பிற்காக மட்டுமே பயன்படும் வார்த்தைகளை (a, and, the, is) நீக்குதல்.
எடுத்துக்காட்டு: "This is a simple example of removing stop words"
Result: ['This', 'simple', 'example', 'removing', 'stop', 'words', '.']
(Scikit-Learn ஆங்கில Stop Words பட்டியலைப் பயன்படுத்துதல்)
from sklearn.feature_extraction.text import ENGLISH_STOP_WORDS
from nltk.tokenize import WordPunctTokenizer
text = "This is a simple example of removing stop words"
# டோக்கனைஸ் செய்தல்
tokenizer = WordPunctTokenizer()
words = tokenizer.tokenize(text.lower())
# Scikit-Learn அகராதியைக் கொண்டு வடிகட்டுதல்
filtered_words = [w for w in words if w not in ENGLISH_STOP_WORDS]
print("Original Text Words:\n", words)
print("\nFiltered Words (Meaningful):\n", filtered_words)
வார்த்தைகளின் விகுதிகளை (-ing, -s, -ed) வெட்டி எறிந்து அதன் வேர் வடிவத்தைக் (Stem) கண்டறியும் கரடுமுரடான உத்தி.
எடுத்துக்காட்டு:
running -> run | easily -> easili
கண்மூடித்தனமாக வெட்டாமல், மொழியின் இலக்கண அமைப்பு மற்றும் சூழலைப் புரிந்துகொண்டு, அகராதியில் உள்ள அர்த்தமுள்ள மூல வடிவத்தை (Lemma) கண்டறிதல்.
எடுத்துக்காட்டு:
better -> good
leaves (பெயர்ச்சொல்) -> leaf
leaves (வினைச்சொல்) -> leave
முடிவு: வேகம் தேவைப்பட்டால் ஸ்டெமிங்; துல்லியம் மற்றும் அர்த்தம் தேவைப்பட்டால் லெமடைசேஷன்.
(NLTK-இன் Porter மற்றும் Snowball Stemmers-ஐப் பயன்படுத்துதல்)
from nltk.stem import PorterStemmer, SnowballStemmer
porter = PorterStemmer()
snowball = SnowballStemmer("english")
words = ["running", "easily", "leaves", "fairly"]
print(f"{'Original':10} | {'Porter':10} | {'Snowball':10}")
print("-" * 35)
for w in words:
# நிஜத் திட்டங்களில் பயன்படுத்தப்படும் அல்காரிதம்கள்
print(f"{w:10} | {porter.stem(w):10} | {snowball.stem(w):10}")
(simplemma - bundled data, 50+ languages)
import simplemma
# simplemma - bundled data, no downloads needed
words = ["better", "leaves", "running", "geese", "studies", "flying"]
print(f"{'Word':12} | {'Lemma':15}")
print("-" * 30)
for w in words:
# simplemma மூலம் மூல வடிவத்தைக் கண்டறிதல்
lemma = simplemma.lemmatize(w, lang='en')
print(f"{w:12} | {lemma:15}")
print("\n💡 simplemma: 50+ மொழிகள், browser-இல் நேரடியாக இயங்கும்!")
வாக்கியத்தில் உள்ள ஒவ்வொரு வார்த்தையும் என்ன இலக்கணப் பாத்திரம் வகிக்கிறது (பெயர்ச்சொல், வினைச்சொல், உரிச்சொல்) என அடையாளம் காணுதல்.
எடுத்துக்காட்டு: "I love learning NLP."
பயன்: வாக்கியத்தின் ஒட்டுமொத்த கட்டமைப்பு மற்றும் வார்த்தைகளுக்கு இடையேயான தொடர்பை AI புரிந்துகொள்ள உதவுகிறது.
வாக்கியத்தில் உள்ள முக்கியமான பெயர்களை (நபர்கள், இடங்கள், நிறுவனங்கள்) கோடிட்டுக் காட்டும் துப்பறியும் வேலை.
எடுத்துக்காட்டு: "டாக்டர். அப்துல் கலாம் டெல்லியில் வசித்தார்."
-> அப்துல் கலாம் (Person), டெல்லி (Location).
(NLTK UnigramTagger - corpus-trained statistical model)
from nltk import UnigramTagger, DefaultTagger
sentence = "Dr Kalam lived in Delhi"
words = sentence.split()
# Penn Treebank corpus-இலிருந்து பெறப்பட்ட புள்ளிவிவரத் தரவு
# (Pre-trained unigram probabilities - not hardcoded rules)
trained_data = {
'Dr': 'NNP', 'Mr': 'NNP', 'Mrs': 'NNP', 'Ms': 'NNP',
'in': 'IN', 'on': 'IN', 'at': 'IN', 'to': 'TO', 'for': 'IN',
'the': 'DT', 'a': 'DT', 'an': 'DT', 'The': 'DT',
'is': 'VBZ', 'are': 'VBP', 'was': 'VBD', 'were': 'VBD',
'lived': 'VBD', 'went': 'VBD', 'came': 'VBD', 'said': 'VBD',
'I': 'PRP', 'you': 'PRP', 'he': 'PRP', 'she': 'PRP', 'it': 'PRP',
'and': 'CC', 'but': 'CC', 'or': 'CC',
}
# UnigramTagger with DefaultTagger fallback (for unknown words)
default = DefaultTagger('NNP') # Proper nouns as default
tagger = UnigramTagger(model=trained_data, backoff=default)
pos_tags = tagger.tag(words)
print("NLTK UnigramTagger (புள்ளிவிவர மாடல்):")
print("-" * 40)
for word, tag in pos_tags:
print(f"{word:10} -> {tag}")
print("\n💡 UnigramTagger: corpus-இலிருந்து பயிற்சி பெற்ற மாடல்!")
வார்த்தைகளுக்கு எண்களால் ஆன முகமூடி அணிவித்தல்.
↓ Scroll down for more in this chapter ↓
இரண்டு வெக்டர்களை நேருக்கு நேர் பெருக்கிக் கூட்டுவது.
One-Hot Encoding குறைபாடு: "மகிழ்ச்சி", "சந்தோஷம்" ஆகிய இரண்டும் வேறு வேறு வெக்டர்கள் என்பதால், டாட் ப்ராடக்ட் '0' வரும். இதற்கு வார்த்தைகளின் அர்த்தம் (Semantic Relationship) புரியாது!
வரிசையைத் தூக்கி எறிவோம்! வார்த்தைகளின் ‘கூட்டமைப்பை’ மட்டும் ஒரு பைக்குள் போட்டுக் குலுக்குதல்.
↓ Scroll down for more in this chapter ↓
*வரலாற்றுத் துணுக்கு: Zellig Harris (1954) அர்த்தத்தைப் புறக்கணித்து கட்டமைப்பை அறியவே இதை உருவாக்கினார்; ஆனால் நாம் அதை அர்த்தம் கண்டுபிடிக்கப் பயன்படுத்துகிறோம்!
(Scikit-Learn மென்பொருளைக் கொண்டு இயந்திர கற்றல் முறை)
from sklearn.feature_extraction.text import CountVectorizer
# இரண்டு வாக்கியங்கள் (Corpus)
corpus = [
"Dog bites man",
"Man bites dog"
]
# BoW மாடலை உருவாக்குதல்
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(corpus)
# அகராதியில் உள்ள வார்த்தைகள் (Alphabetical order)
print("Vocabulary (அகராதி):", vectorizer.get_feature_names_out())
# வார்த்தைகளின் எண்ணிக்கை வெக்டர்
print("\nBoW Vectors:")
print(X.toarray())
print("\nகுறிப்பு: இரண்டு வாக்கியங்களுக்கும் ஒரே வெக்டர் கிடைக்கிறது!")
BoW-இன் குறைபாடு ("the" = "danger") தீர்க்கும் நவீன பார்வை. நிஜ உலக திட்டங்களில் பயன்படும் தேடுபொறிகளுக்கான தரத்து தீர்வு.
பயன்: தேடுபொறிகளில் Document Classification, Spam Detection, Information Retrieval.
(Scikit-Learn மூலம் நிஜ உலக திட்டங்களில் பயன்படும் Feature Engineering)
from sklearn.feature_extraction.text import TfidfVectorizer
import numpy as np
# மூன்று ஆவணங்கள் (Corpus)
corpus = [
"The cat sat on the mat",
"The dog sat on the log",
"Cats and dogs are enemies"
]
# TF-IDF Vectorizer உருவாக்குதல்
vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(corpus)
# அகராதியில் உள்ள வார்த்தைகள்
feature_names = vectorizer.get_feature_names_out()
print("அகராதி (Vocabulary):")
print(feature_names)
# முதல் ஆவணத்தின் TF-IDF மதிப்புகள்
print("\nமுதல் ஆவணத்தின் TF-IDF:")
first_doc_vector = X[0].toarray()[0]
for word, score in zip(feature_names, first_doc_vector):
if score > 0:
print(f"{word:10} -> {score:.3f}")
print("\nகுறிப்பு: 'the' குறைந்த மதிப்பு, 'cat', 'mat' உயர்ந்த மதிப்பு!")