Sitemap

Natural Language Processing

Word Embeddings - LDA - NER

--

Press enter or click to view image in full size
  • Doğal Dil İşleme (NLP) projelerinde, metin verilerini anlamlandırmak ve üzerinde analizler yapmak için bir dizi yöntem ve araç kullanılır. Bu proje kapsamında, önce Word Embeddings ile kelimelerin vektör temsilleri oluşturuldu; kelimeler arasındaki benzerlikler ve ilişkiler incelendi. Ardından, komedyenlerin performans transkriptleri üzerinden Latent Dirichlet Allocation (LDA) kullanılarak metinlerin hangi konularda yoğunlaştığı analiz edildi. Metinler, NLTK ve Gensim kütüphaneleriyle temizlendi, sadece anlamlı kelimeler (isimler ve sıfatlar) seçildi ve stopwords’ler çıkarıldı. Son olarak, Named Entity Recognition (NER) ile metinlerde geçen özel isimler, kuruluşlar, tarih ve yerler gibi varlıklar tespit edildi. Bu adımlar, metin verilerinin hem sayısal hem de anlamsal olarak modellenmesini sağlayarak ileri analizler ve görselleştirmeler için zemin hazırladı.

Word Embeddings

  • Word Embeddings, kelimeleri anlamsal benzerlikleri korunacak şekilde sayısal vektörlere dönüştüren bir yöntemdir. Bu sayede NLP modelleri yalnızca kelime sıklıklarını değil, kelimeler arasındaki bağlam ve anlam ilişkilerini de öğrenebilir.
import pandas as pd

# Veri analizi ve veri manipülasyonu işlemlerini kolaylaştırmak için Pandas kütüphanesini içe aktarır

from sklearn.preprocessing import LabelEncoder, OneHotEncoder

# Kategorik verileri sayısal forma dönüştürmek için LabelEncoder ve OneHotEncoder sınıflarını içe aktarır
df = pd.DataFrame({

# Kategorik ve sayısal özellikleri içeren örnek bir veri seti tanımlanır

'color': ['red','blue','green','green','red','blue'],

# Ürünlerin renk bilgilerini içeren kategorik sütun

'size': ['small','medium','large','medium','small','large'],

# Ürünlerin boyut bilgisini temsil eden kategorik sütun

'classlabel': ['yes','no','yes','yes','no','yes'],

# Hedef değişken olarak kullanılabilecek sınıf etiketi sütunu

'price': [140.5,70.5,210.0,130.5,150.5,70.5]

# Ürün fiyatlarını gösteren sayısal sütun

})
df

# Oluşturulan DataFrame içeriğini tablo halinde görüntüler
le = LabelEncoder()

# Kategorik sınıf etiketlerini (string) sayısal değerlere dönüştürmek için LabelEncoder nesnesi oluşturur
df['size2'] = le.fit_transform(df['size'])

# 'size' sütunundaki kategorik değerleri LabelEncoder kullanarak sayısal formata dönüştürür

df
ohe = OneHotEncoder()

# Kategorik verileri one-hot encoding yöntemiyle sayısal forma dönüştürmek için OneHotEncoder nesnesi oluşturulur
ohe.fit_transform(df[['color']]).toarray()

# Color sütununu one-hot encoding ile sayısal matrise dönüştürür
df=pd.get_dummies(df,drop_first=True)

# DataFrame içindeki kategorik değişkenleri otomatik olarak one-hot encoding yaparak sayısal hale getirir

df

Gensim - Spacy

pip install gensim

# Word Embeddings (Word2Vec, GloVe vb.) oluşturmak ve kullanmak için gensim kütüphanesini yükler

pip install spacy

# Gelişmiş doğal dil işleme (tokenization, POS tagging, NER) işlemleri için SpaCy kütüphanesini yükler

from gensim.models import Word2Vec

# Gensim kütüphanesinden kelimeleri vektör temsillerine dönüştürmek için kullanılan Word2Vec modelini içe aktarır
cumleler= [['Hello','This','is','python','training','by','Aman'],

['Hello','This','is','Java','training','by','Aman'],

['Hello','This','is','Data Science','training','by','Unfold','Data','Science'],

['Hello','This','is','programming','training','']]

# Word embedding ve NLP çalışmalarında kullanılmak üzere tokenlara ayrılmış örnek cümleleri içeren bir liste oluşturur
model=Word2Vec(cumleler,min_count=1)

# Verilen cümleler üzerinden Word2Vec algoritması ile kelimelerin vektörel temsillerini öğrenen bir model oluşturur
words= list(model.wv.key_to_index)

# Word2Vec modeli tarafından öğrenilen tüm benzersiz kelimeleri bir liste olarak alır
words

# Word2Vec modelinin öğrendiği tüm benzersiz kelimeleri (vocabulary) listeler
model.wv['Hello']

# Word2Vec modeli tarafından öğrenilen "Hello" kelimesinin sayısal vektör temsilimini döndürür

Get Sevval İclal C.’s stories in your inbox

Join Medium for free to get updates from this writer.

Cosine Similarity

  • İki vektör (kelime embedding) arasındaki anlamsal benzerliği ölçmek için kullanılan metriktir
model.wv.most_similar('Hello')

# Word2Vec modelinde "Hello" kelimesine anlamsal olarak en benzer kelimeleri cosine similarity kullanarak bulur
model.wv.most_similar('Science')

# 'Science' kelimesine vektör uzayında en yakın (anlamsal olarak en benzer) kelimeleri cosine similarity kullanarak listeler

LDA = Latent Drichlet Allocation Topic Modelling

  • LDA, metin dokümanları içerisindeki gizli konuları (topic) olasılıksal olarak keşfetmek için kullanılan bir konu modelleme yöntemidir.
import gensim

# Gensim kütüphanesi, konu modelleme ve metin madenciliği işlemleri için kullanılır


from gensim import corpora

# Metinleri sayısal sözlük (dictionary) yapısına dönüştürmek için kullanılır


from gensim.models import LdaModel

# LDA konu modelini oluşturmak için gerekli sınıf içe aktarılır



# Sample documents

documents = [

"Tennis is my favorite sport to play.",

"Football is a popular competition in certain country.",

"There are many athletes currently training for the olympic."

]

# Konu modelleme yapılacak örnek metin dokümanları tanımlanır



# Preprocess documents

texts = [[word for word in document.lower().split()] for document in documents]

# Metinler küçük harfe çevrilir ve kelime bazlı listelere ayrılır


dictionary = corpora.Dictionary(texts)

# Kelimelerden benzersiz bir sözlük (id–kelime eşlemesi) oluşturulur


corpus = [dictionary.doc2bow(text) for text in texts]

# Her doküman, kelime–frekans çiftlerinden oluşan sayısal formata dönüştürülür



# The LDA model

lda_model = LdaModel(corpus, num_topics=2, id2word=dictionary, passes=15)

# 2 konu (topic) olacak şekilde LDA modeli eğitilir


topics = lda_model.print_topics()

# Modelin öğrendiği konular ve bu konulara ait kelimeler alınır


for topic in topics:

print(topic)

# Her bir konunun içeriği ekrana yazdırılır

Necessary Libraries

# Import necessary libraries
import requests
from bs4 import BeautifulSoup
import gensim
from gensim import corpora
from gensim.models import LdaModel

# Gerekli web scraping ve topic modeling kütüphaneleri içe aktarılır


# Function to scrape transcript data
def url_to_transcript(url):
'''Returns transcript text specifically from scrapsfromtheloft.com.'''

# Verilen URL'den HTML içeriğini çeker
page = requests.get(url).text

# HTML içeriği BeautifulSoup ile parse edilir
soup = BeautifulSoup(page, "lxml")

# Sayfa içerisindeki konuşma metinleri paragraf bazında alınır
text = [p.text for p in soup.find(class_="ast-container").find_all('p')]

# Başarılı scraping işlemi kullanıcıya bildirilir
print(f'Successfully scraped: {url}')

# Paragraflar birleştirilerek tek bir metin olarak döndürülür
return ' '.join(text)


# URLs of transcripts
urls = [
'http://scrapsfromtheloft.com/2017/05/06/louis-ck-oh-my-god-full-transcript/',
'http://scrapsfromtheloft.com/2017/04/11/dave-chappelle-age-spin-2017-full-transcript/',
'http://scrapsfromtheloft.com/2018/03/15/ricky-gervais-humanity-transcript/',
'https://scrapsfromtheloft.com/comedy/bo-burnham-what-transcript/',
'http://scrapsfromtheloft.com/2017/05/24/bill-burr-im-sorry-feel-way-2014-full-transcript/',
'http://scrapsfromtheloft.com/2017/04/21/jim-jefferies-bare-2014-full-transcript/',
'http://scrapsfromtheloft.com/2017/08/02/john-mulaney-comeback-kid-2015-full-transcript/',
'https://scrapsfromtheloft.com/comedy/hasan-minhaj-homecoming-king-transcript/',
'http://scrapsfromtheloft.com/2017/09/19/ali-wong-baby-cobra-2016-full-transcript/',
'http://scrapsfromtheloft.com/2017/08/03/anthony-jeselnik-thoughts-prayers-2015-full-transcript/',
'http://scrapsfromtheloft.com/2018/03/03/mike-birbiglia-my-girlfriends-boyfriend-2013-full-transcript/',
'http://scrapsfromtheloft.com/2017/08/19/joe-rogan-triggered-2016-full-transcript/'
]

# Stand-up komedyenlerine ait konuşma metinlerinin URL listesi tanımlanır


# Comedian names (for reference)
comedians = ['louis', 'dave', 'ricky', 'bo', 'bill', 'jim', 'john', 'hasan', 'ali', 'anthony', 'mike', 'joe']

# Metinlerin hangi komedyene ait olduğunu temsil eden referans listesi oluşturulur


# Scrape transcripts
documents = [url_to_transcript(url) for url in urls]

# Her URL için konuşma metinleri çekilerek documents listesine aktarılır


# Preprocess the transcripts for LDA modeling
texts = [
gensim.utils.simple_preprocess(doc, deacc=True)
for doc in documents
]

# Metinler küçük harfe çevrilir, noktalama işaretleri temizlenir ve tokenize edilir


# Create dictionary and corpus
dictionary = corpora.Dictionary(texts)

# Metinlerde geçen kelimelerden sözlük (dictionary) oluşturulur

corpus = [dictionary.doc2bow(text) for text in texts]

# Her doküman kelime-frekans (Bag of Words) formatına dönüştürülür


# LDA Model setup
lda_model = LdaModel(
corpus,
num_topics=5,
id2word=dictionary,
passes=15,
random_state=42
)

# Konuşma metinlerinden 5 ana konu çıkarmak için LDA modeli eğitilir


# Print the topics
topics = lda_model.print_topics(num_words=10)

# Her konuya ait en önemli 10 kelime alınır

print("\nTopics discovered in comedians' transcripts:")

# LDA modelinin bulduğu konular ekrana yazdırılır

for idx, topic in topics:
print(f"Topic #{idx + 1}: {topic}\n")

# Her bir konunun içeriği sırasıyla kullanıcıya gösterilir

Nltk

import nltk

nltk.download('punkt_tab')

# NLTK kütüphanesinde cümle ve kelime tokenization işlemleri için gerekli olan 'punkt' veri paketini indirir
nltk.download('averaged_perceptron_tagger_eng')

# İngilizce metinler için kelimelerin dilbilgisel etiketlerini (POS tagging) belirlemek amacıyla kullanılan modeli indirir
# Imports
import requests
from bs4 import BeautifulSoup
import pandas as pd
import gensim
from gensim import corpora
from gensim.models.ldamulticore import LdaMulticore
import re
import nltk
from nltk.tokenize import word_tokenize
from nltk import pos_tag
from nltk.stem import WordNetLemmatizer
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction import text
nltk.download('punkt')
nltk.download('averaged_perceptron_tagger')
nltk.download('wordnet')

# Scrape function
def url_to_transcript(url):
page = requests.get(url).text
soup = BeautifulSoup(page, "lxml")
paragraphs = soup.find(class_="ast-container").find_all('p')
text_data = ' '.join(p.text for p in paragraphs)
print(f'Successfully scraped: {url}')
return text_data

# Custom stopwords
add_stop_words = [
'like', 'im', 'know', 'just', 'dont', 'thats', 'right', 'people', 'youre', 'got',
'gonna', 'time', 'think', 'yeah', 'said', 'want', 'say', 'thing', 'going', 'shit',
'fucking', 'didnt', 'hes', 'shes', 'theyre', 'weve', 'ill', 'youve', 'ive', 'couldnt',
'wouldnt', 'cant', 'wont', 'one', 'get', 'really', 'see', '♪', 'g', 'okay'
]

# Convert frozenset to list for CountVectorizer
stop_words = list(text.ENGLISH_STOP_WORDS.union(add_stop_words))


# Lemmatizer
lemmatizer = WordNetLemmatizer()

# Function to extract only nouns and adjectives
def nouns_adj(text):
text = text.lower()
text = re.sub(r"’", "'", text)
text = re.sub(r"[^a-zA-Z']", " ", text)
text = re.sub(r'\s+', ' ', text)
tokenized = word_tokenize(text)
tagged = pos_tag(tokenized)
is_noun_adj = lambda pos: pos.startswith('NN') or pos.startswith('JJ')
words = [lemmatizer.lemmatize(word) for word, pos in tagged if is_noun_adj(pos) and word not in stop_words]
return ' '.join(words)

# URLs and comedian names
urls = [
'http://scrapsfromtheloft.com/2017/05/06/louis-ck-oh-my-god-full-transcript/',
'http://scrapsfromtheloft.com/2017/04/11/dave-chappelle-age-spin-2017-full-transcript/',
'http://scrapsfromtheloft.com/2018/03/15/ricky-gervais-humanity-transcript/',
'https://scrapsfromtheloft.com/comedy/bo-burnham-what-transcript/',
'http://scrapsfromtheloft.com/2017/05/24/bill-burr-im-sorry-feel-way-2014-full-transcript/',
'http://scrapsfromtheloft.com/2017/04/21/jim-jefferies-bare-2014-full-transcript/',
'http://scrapsfromtheloft.com/2017/08/02/john-mulaney-comeback-kid-2015-full-transcript/',
'https://scrapsfromtheloft.com/comedy/hasan-minhaj-homecoming-king-transcript/',
'http://scrapsfromtheloft.com/2017/09/19/ali-wong-baby-cobra-2016-full-transcript/',
'http://scrapsfromtheloft.com/2017/08/03/anthony-jeselnik-thoughts-prayers-2015-full-transcript/',
'http://scrapsfromtheloft.com/2018/03/03/mike-birbiglia-my-girlfriends-boyfriend-2013-full-transcript/',
'http://scrapsfromtheloft.com/2017/08/19/joe-rogan-triggered-2016-full-transcript/'
]

comedians = ['Louis CK', 'Dave Chappelle', 'Ricky Gervais', 'Bo Burnham', 'Bill Burr',
'Jim Jefferies', 'John Mulaney', 'Hasan Minhaj', 'Ali Wong',
'Anthony Jeselnik', 'Mike Birbiglia', 'Joe Rogan']

# Scrape and clean
documents = [url_to_transcript(url) for url in urls]
cleaned_docs = [nouns_adj(doc) for doc in documents]

# Build CountVectorizer
cv = CountVectorizer(stop_words=stop_words, max_df=0.8)
data_cv = cv.fit_transform(cleaned_docs)

# Convert into pandas DataFrame for gensim
dtm = pd.DataFrame(data_cv.toarray(), columns=cv.get_feature_names_out())

# Create corpus for LDA
corpus = gensim.matutils.Sparse2Corpus(data_cv, documents_columns=False)
id2word = dict((id, word) for word, id in cv.vocabulary_.items())

# LDA Model (12 topics for 12 comedians)
lda_model = LdaMulticore(corpus, num_topics=12, id2word=id2word, passes=50, workers=2, random_state=42)

# Show topics
topics = lda_model.print_topics(num_words=10)
for idx, topic in topics:
print(f"\n📝 Topic {idx}:\n{topic}")

NER Named Entity Recognition

  • Bir metin içerisinde geçen kişi, yer, organizasyon, tarih gibi özel varlıkları otomatik olarak tespit etmeye yarar
import spacy

# Named Entity Recognition (NER) gibi gelişmiş NLP görevleri için spaCy kütüphanesini projeye dahil eder
!python -m spacy download en_core_web_md
nlp=spacy.load(name='en_core_web_md')

# SpaCy’nin orta ölçekli İngilizce dil modelini (kelime vektörleri ve NER dahil) belleğe yükler
doc=nlp('Jonathan is looking for a job in Turkey for 50k. World Health Organization WHO')

# Verilen metni NLP pipeline’dan geçirerek token, entity ve dilsel özellikleri analiz eder
for token in doc:

print(token.text, token.lemma_, token.pos_, token.tag_, token.dep_,

token.shape_, token.is_alpha, token.is_stop)

# Metindeki her bir kelimenin kökünü, sözcük türünü, sözdizimsel görevini ve temel dilsel özelliklerini analiz ederek ekrana yazdırır
from spacy import displacy

# spaCy ile Named Entity ve dependency yapılarını görsel olarak göstermek için kullanılan görselleştirme modülünü içe aktarır
displacy.render(doc, style='dep')

# Metindeki kelimeler arasındaki bağımlılık (dependency) ilişkilerini görsel olarak gösterir
text = '''When Sebastian Thrun started working on self-driving cars at Google in 2007, few people outside of the company took him seriously.

He immigrated in 2003. Zafer loves NLP'''

# Named Entity Recognition (NER) uygulanacak örnek metni tanımlar


doc = nlp(text)

# Metni spaCy NLP pipeline’ından geçirerek varlık tanıma (NER) için işler


displacy.render(doc, style="ent")

# Metin içerisindeki kişi, tarih, organizasyon gibi varlıkları görsel olarak gösterir
  • Yapılan çalışmada, Word Embeddings sayesinde kelimeler arasındaki anlamsal ilişkiler gözlemlenebilir hale geldi ve model benzer kelimeleri tespit edebildi. LDA ile metinlerin hangi konularda yoğunlaştığı keşfedildi ve farklı komedyenlerin konuşma içerikleri görselleştirilebilecek şekilde kategorilere ayrıldı. NER sayesinde metinlerdeki kişi, yer, kuruluş ve tarih bilgileri ayrıştırıldı, böylece metinler daha yapılandırılmış bir formata kavuştu. Tüm bu adımlar, ham metin verilerinin modellenebilir, analiz edilebilir ve görselleştirilebilir hale gelmesini sağlayarak NLP projelerinde temel bir workflow’un nasıl oluşturulacağını gösterdi.

--

--

Sevval İclal C.
Sevval İclal C.

Written by Sevval İclal C.

I write about my learning journey in Data Science, Machine Learning, and AI - sharing hands-on insights from real projects