Daha Derin Bir Anlam: Python'da Konu Modelleme

Yayınlanan: 2022-03-11

Bilgisayarlar ve onlara güç sağlayan işlemciler sayılarla çalışmak üzere üretilmiştir. Buna karşılık, e-postaların ve sosyal medya gönderilerinin günlük dili, kendisini hesaplamaya uygun olmayan gevşek bir yapıya sahiptir.

İşte burada doğal dil işleme (NLP) devreye girer. NLP, doğal dili ve konuşmayı analiz etmek için hesaplama teknikleri (yani yapay zeka) uygulayarak dilbilim ile örtüşen bir bilgisayar bilimi dalıdır. Konu modelleme, belirli bir metnin hangi konular hakkında olduğunu anlamaya odaklanır. Konu modelleme, geliştiricilerin sosyal medyada son dakika haberlerini tespit etme, kişiselleştirilmiş mesajlar önerme, sahte kullanıcıları tespit etme ve bilgi akışını karakterize etme gibi yararlı özellikleri uygulamalarına olanak tanır.

Geliştiriciler, bu karmaşıklık düzeylerinde insan iletişimini anlamak için hesaplama odaklı bilgisayarları nasıl ikna edebilir?

bir torba kelime

Bu soruyu cevaplamak için, bir metni matematiksel olarak tanımlayabilmemiz gerekir. Konu modelleme Python eğitimimize en basit yöntemle başlayacağız: kelime çantası.

Bu yöntem, bir metni bir dizi sözcük olarak temsil eder. Örneğin, This is an example cümlesi, bu kelimelerin görünme sıklığı kullanılarak bir dizi kelime olarak tanımlanabilir:

 {"an": 1, "example": 1, "is": 1, "this": 1}

Bu yöntemin sözcük sırasını nasıl yok saydığına dikkat edin. Şu örnekleri alın:

  • "Yıldız Savaşlarını severim ama Harry Potter'ı sevmiyorum."
  • "Harry Potter'ı severim ama Star Wars'u sevmiyorum."

Bu duygular aynı kelimelerle temsil edilir, ancak zıt anlamları vardır. Ancak metinlerin konularını analiz etmek amacıyla bu farklılıklar önemli değildir. Her iki durumda da, bu tatlar ne olursa olsun, Harry Potter ve Star Wars zevklerinden bahsediyoruz. Bu nedenle, kelime sırası önemsizdir.

Birden fazla metnimiz olduğunda ve aralarındaki farkları anlamaya çalıştığımızda, tüm derlemimiz için her metni ayrı ayrı ele alan matematiksel bir temsile ihtiyacımız vardır. Bunun için her sütunun bir kelimeyi veya terimi temsil ettiği ve her satırın bir metni temsil ettiği bir matris kullanabiliriz. Bir derlemin olası bir temsili, her hücrede belirli bir metinde (satırda) belirli bir kelimenin (sütun) kullanılma sıklığının not edilmesinden oluşur.

Örneğimizde, derlem iki cümleden oluşur (matris satırlarımız):

 ["I like Harry Potter", "I like Star Wars"]

Bu derlemdeki kelimeleri karşılaştığımız sırayla listeleriz: I , like , Harry , Potter , Star , Wars . Bunlar matris sütunlarımıza karşılık gelir.

Matristeki değerler, belirli bir kelimenin her bir ifadede kaç kez kullanıldığını temsil eder:

 [[1,1,1,1,0,0], [1,1,0,0,1,1]] 

Resim solda iki satır metin gösteriyor: Harry Potter'ı seviyorum ve Star Wars'u seviyorum. Bu metin daha sonra ortada bir kelime torbasına dönüştürülür ve her kelimenin ardından o kelimenin kaç kez kullanıldığı belirtilir: "Harry Potter'ı severim", "{I: 1, like: 1, Harry: 1, Potter olur. : 1, Star: 0, Wars: 0}" ve "Star Wars'ı seviyorum" ifadesi "{I: 1, like: 1, Harry: 0, Potter: 0, Star: 1, Wars: 1}" olur sağda , bu sayılar daha sonra bir matris gösteriminde düzenlenir: Birincisi "1 1 1 1 0 0" satırı olur ve ikincisi "1 1 0 0 1 1" olur.
Matris Temsiline Dönüştürülen Metin

Matrisin boyutunun, metin sayısı ile en az bir metinde geçen farklı kelime sayısı çarpılarak belirlendiğini unutmayın. İkincisi genellikle gereksiz yere büyüktür ve azaltılabilir. Örneğin, bir matris, anlamlarının benzer olmasına bakılmaksızın, "play" ve "played" gibi birleşik fiiller için iki sütun içerebilir.

Ancak yeni kavramları tanımlayan sütunlar eksik olabilir. Örneğin, "klasik" ve "müzik"in her birinin ayrı anlamları vardır, ancak birleştirildiğinde - "klasik müzik" - başka bir anlama gelirler.

Bu sorunlardan dolayı, iyi sonuçlar elde etmek için metni önceden işlemek gerekir.

Ön İşleme ve Konu Kümeleme Modelleri

En iyi sonuçlar için birden fazla ön işleme tekniği kullanmak gerekir. İşte en sık kullanılanlardan bazıları:

  1. Küçük harfler. Tüm kelimeleri küçük harf yapın. Tüm kelimeleri küçük harf yapın. Bir kelimenin anlamı cümledeki yeri ne olursa olsun değişmez.
  2. n -gram. Bir satırdaki tüm n sözcük gruplarını, n-gram adı verilen yeni terimler olarak kabul edin. Bu şekilde “beyaz saray” gibi durumlar dikkate alınarak kelime listesine eklenecektir.
  3. Kök salmak. Köklerinden ayırmak için kelimelerin öneklerini ve soneklerini belirleyin. Bu şekilde, "oynat", "oynatıldı" veya "oyuncu" gibi kelimeler "oynat" kelimesiyle temsil edilir. Köklendirme, anlamlarını korurken sözcük listesindeki sözcük sayısını azaltmak için yararlı olabilir, ancak tümcedeki her sözcük için uygulanması gerektiğinden ön işlemeyi önemli ölçüde yavaşlatır.
  4. Kelimeleri durdur. Anlamı veya faydası olmayan kelime gruplarını dikkate almayın. Bunlar, makaleleri ve edatları içerir, ancak bazı yaygın fiiller gibi özel durum çalışmamız için yararlı olmayan kelimeleri de içerebilir.
  5. Terim frekansı-ters belge frekansı (tf-idf). Matrisin her hücresindeki her kelimenin frekansını not etmek yerine tf-idf katsayısını kullanın. Çarpılan iki sayıdan oluşur:
    • tf—bir metindeki belirli bir terimin veya kelimenin sıklığı ve
    • idf—Belirli terimi içeren belge sayısına bölünen toplam belge sayısının logaritması.

    tf–idf, bir kelimenin derlemde ne sıklıkta kullanıldığının bir ölçüsüdür. Kelimeleri gruplara ayırabilmek için, sadece her metinde hangi kelimelerin geçtiğini anlamak değil, aynı zamanda hangi kelimelerin bir metinde sıklıkla geçtiğini, ancak diğerlerinde hiç bulunmadığını anlamak önemlidir.

Aşağıdaki şekil, ilgili ve yönetilebilir bir kelime listesi oluşturmak için korpusun orijinal metninin değiştirildiği bu ön işleme tekniklerinin bazı basit örneklerini göstermektedir.

"Küçük harf" tekniği, "Beyaz Saray" cümlesini dönüştürür. bir kelime listesine dönüştürün: "the", "white", "house". "n-gram" tekniği onu daha uzun bir listeye dönüştürür: "the", "white", "house", "the white", "white house". "Saplama" tekniği, "Futbolcu iyi bir oyun oynadı" cümlesini dönüştürüyor. bu listeye: "the", "futbol", "play", "a", "good", "game". "Stopwords" tekniği onu daha kısa bir listeye dönüştürür: "futbol", "oyun", "iyi", "oyun".
Metin Ön İşleme Tekniklerine Örnekler

Şimdi bu tekniklerin bazılarının Python'da nasıl uygulanacağını göstereceğiz. Derlemi matematiksel olarak temsil ettikten sonra, denetlenmeyen makine öğrenimi algoritmaları uygulayarak tartışılan konuları belirlememiz gerekir. Bu durumda, "denetimsiz", algoritmanın çıktısına uygulamak için "bilim kurgu" gibi önceden tanımlanmış konu etiketlerine sahip olmadığı anlamına gelir.

Derlemimizi kümelemek için, negatif olmayan matris çarpanlara ayırma (NMF), seyrek temel bileşenler analizi (seyrek PCA) ve gizli dirichlet tahsisi (LDA) dahil olmak üzere çeşitli algoritmalar arasından seçim yapabiliriz. LDA'ya odaklanacağız çünkü sosyal medya, tıp bilimi, siyaset bilimi ve yazılım mühendisliğindeki iyi sonuçları nedeniyle bilimsel topluluk tarafından yaygın olarak kullanılmaktadır.

LDA, denetimsiz konu ayrıştırması için bir modeldir: Metinleri içerdikleri kelimelere ve belirli bir konuya ait bir kelimenin olasılığına göre gruplandırır. LDA algoritması, konu kelime dağılımını verir. Bu bilgilerle, ana konuları onlarla ilişkili olması muhtemel kelimelerden yola çıkarak tanımlayabiliriz. Ana konuları ve bunlarla ilişkili kelimeleri belirledikten sonra, her bir metin için hangi konu veya konuların geçerli olduğunu bilebiliriz.

Beş kısa cümleden (tümü New York Times manşetlerinden alınmıştır) oluşan aşağıdaki derlemi düşünün:

 corpus = [ "Rafael Nadal Joins Roger Federer in Missing US Open", "Rafael Nadal Is Out of the Australian Open", "Biden Announces Virus Measures", "Biden's Virus Plans Meet Reality", "Where Biden's Virus Plan Stands"]

Algoritma, siyaset ve koronavirüs ile ilgili bir konuyu ve Nadal ve tenis ile ilgili ikinci bir konuyu açıkça tanımlamalıdır.

Python'da Stratejiyi Uygulamak

Konuları tespit edebilmek için gerekli kütüphaneleri import etmemiz gerekiyor. Python, NLTK ve Scikit-learn (sklearn) dahil olmak üzere NLP ve makine öğrenimi için bazı yararlı kitaplıklara sahiptir.

 from sklearn.feature_extraction.text import CountVectorizer from sklearn.feature_extraction.text import TfidfTransformer from sklearn.decomposition import LatentDirichletAllocation as LDA from nltk.corpus import stopwords

CountVectorizer() kullanarak, CountVectorizer() kullanarak her metnin kelimelerinin sıklığını gösteren matrisi oluşturuyoruz. Durma sözcüklerini dahil etmek için ngram_range , n -gramları dahil etmek için ngram_range veya tüm karakterleri küçük harfe dönüştürmek için küçük lowercase=True gibi parametreler stop_words ön işlemeye izin verdiğini unutmayın.

 count_vect = CountVectorizer(stop_words=stopwords.words('english'), lowercase=True) x_counts = count_vect.fit_transform(corpus) x_counts.todense() matrix([[0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0], [0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0], [1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], [0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1], [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1]], dtype=int64)

Derlemimizin kelime dağarcığını tanımlamak için basitçe .get_feature_names() niteliğini kullanabiliriz:

 count_vect.get_feature_names() ['announces', 'australian', 'biden', 'federer', 'joins', 'measures', 'meet', 'missing', 'nadal', 'open', 'plan', 'plans', 'rafael', 'reality', 'roger', 'stands', 'virus']

Ardından, sklearn işleviyle tf–idf hesaplamalarını yaparız:

 tfidf_transformer = TfidfTransformer() x_tfidf = tfidf_transformer.fit_transform(x_counts)

LDA ayrıştırmasını gerçekleştirmek için konu sayısını tanımlamamız gerekir. Bu basit durumda, iki konu veya "boyut" olduğunu biliyoruz. Ancak genel durumlarda, bu, rastgele arama veya ızgara arama gibi algoritmalar kullanılarak yapılabilecek, biraz ayarlama gerektiren bir hiperparametredir:

 dimension = 2 lda = LDA(n_components = dimension) lda_array = lda.fit_transform(x_tfidf) lda_array array([[0.8516198 , 0.1483802 ], [0.82359501, 0.17640499], [0.18072751, 0.81927249], [0.1695452 , 0.8304548 ], [0.18072805, 0.81927195]])

LDA olasılıksal bir yöntemdir. Burada, iki konunun her birine ait beş başlığın her birinin olasılığını görebiliriz. Beklendiği gibi ilk iki metnin birinci konuya, sonraki üç metnin ikinci konuya ait olma olasılığının daha yüksek olduğunu görebiliriz.

Son olarak, bu iki konunun ne hakkında olduğunu anlamak istersek, her konudaki en önemli kelimeleri görebiliriz:

 components = [lda.components_[i] for i in range(len(lda.components_))] features = count_vect.get_feature_names() important_words = [sorted(features, key = lambda x: components[j][features.index(x)], reverse = True)[:3] for j in range(len(components))] important_words [['open', 'nadal', 'rafael'], ['virus', 'biden', 'measures']]

Beklendiği gibi, LDA tenis turnuvaları ve Nadal ile ilgili kelimeleri ilk konuya ve Biden ve virüs ile ilgili kelimeleri ikinci konuya doğru bir şekilde atadı.

Büyük Ölçekli Analizler ve Gerçek Dünya Kullanım Örnekleri

Konu modellemenin geniş ölçekli bir analizi bu yazıda görülebilir; 2016 ABD başkanlık seçimleri sırasında ana haber konularını inceledim ve New York Times ve Fox News gibi bazı kitle iletişim araçlarının haberlerine dahil ettiği yolsuzluk ve göçmenlik gibi konuları gözlemledim. Bu yazıda, kitle iletişim araçları içeriği ile seçim sonuçları arasındaki korelasyonları ve nedensellikleri de analiz ettim.

Konu modelleme, büyük metin koleksiyonlarında bulunan gizli güncel kalıpları keşfetmek için akademi dışında da yaygın olarak kullanılmaktadır. Örneğin, öneri sistemlerinde veya anketlerde, geri bildirim formlarında veya sosyal medyada müşterilerin/kullanıcıların ne hakkında konuştuğunu belirlemek için kullanılabilir.

Toptal Engineering Blog, bu makalede sunulan kod örneklerini gözden geçirdiği için Juan Manuel Ortiz de Zarate'ye şükranlarını sunar.

Konu Modelleme Üzerine Önerilen Okumalar

Twitter'da Geliştirilmiş Konu Modelleme
Albanese, Federico ve Esteban Feuerstein. “Topluluk Havuzuyla Twitter'da İyileştirilmiş Konu Modelleme.” (20 Aralık 2021): arXiv:2201.00690 [cs.IR]

Twitter'ı Halk Sağlığı İçin Analiz Etme
Paul, Michael ve Mark Dredze. "Sen Tweetle Osun: Twitter'ı Halk Sağlığı İçin Analiz Etmek." 3 Ağustos 2021.

Twitter'da Siyasi Yönelimi Sınıflandırma
Cohen, Raviv ve Derek Ruths. “Twitter'da Siyasi Yönelimi Sınıflandırmak: Kolay Değil!” 3 Ağustos 2021.

Birleştirmeyi Yakalamak için İlişkisel Konu Modellerini Kullanma
Gethers, Malcolm ve Denis Poshyvanyk. “Nesneye Yönelik Yazılım Sistemlerinde Sınıflar Arası Birleştirmeyi Yakalamak için İlişkisel Konu Modellerini Kullanma.” 25 Ekim 2010.