Doğal Dil İşleme(NLP) ile Restoran Yorumları Analizi

Cem ÖZÇELİK
8 min readNov 28, 2021

--

Hizmet sektöründe müşterilerin memnun olarak işletmeden ayrılması çok önemli bir unsurdur. Memnuniyeti sağlanmış müşteri yeni müşterileri de söz konusu işletmeye çekebilir. Müşteri memnuniyeti kavramının tarihi ticaretin başlaması zamanına kadar eskiye dayanmaktadır.1980 yıllarında farklılık yaratmak amacıyla müşteri memnuniyeti kavramı uygulanıp kullanılmaya başlanmıştır.(Kuzucu ve Kırdar, 2020)Müşteri memnuniyetinin önemi gelişip ve küreselleşen dünya ile beraber ortaya çıkan rekabet artışından dolayı günden güne önemini koruyup artış göstermektedir (Şendoğdu,2014, s.92).

Müşteri memnuniyetini bir örnekle açıklayalım, hizmet sektöründe bir kafe işlettiğimizi düşünelim ve işletmemize kahve sever bir müşterinin geldiğini düşünelim. İşletmemize gelen bu müşterinin sipariş vermiş olduğu kahvede arıyor olduğu özelliğin ise kahvenin sert bir içimden ziyâde daha yumuşak bir içime sahip olmasını istediğini düşünelim. Sonrasında, işletmemizde çalışmakta olan barista, müşterinin isteğini dikkate alır ve yumuşak içimli bir kahve yaptığında ayrıca her işletmemize ziyaretinde aynı tadı bulduğunda müşteri memnuniyeti kaçınılmaz olarak sağlanmış olacaktır.

Verilen örneğin tersi olursa ve müşteri ürünü aldığında istediği kahveyi bulamazsa bu olumsuz duygusundan dolayı kahve aldığı yerden yani işletmemizden uzaklaşır ve ilişkisini kesebilir. Böylece müşteri kaybı yaşamış oluruz.

Yapılan araştırmalar, kayıp edilen müşterilerin potansiyel müşterileri etkileme düzeyinin kazanılmış bir müşterinin potansiyel müşterileri etkilemesi düzeyinden oldukça fazla olduğunu göstermekte.

Peki, müşteri ilişkilerini bu kadar anlattıktan sonra bir müşterinin işletmemiz hakkındaki düşüncelerinin iyi mi, yoksa kötü mü olduğuna karar veren bir algoritmamız olduğunu düşünelim. Tahmin edebileceğimiz gibi böyle bir dünya da müşterilerimizden gelen geri bildirimleri dikkate alarak müşteri ilişkilerimizi daha iyi yönetebiliriz.

Biz de bu çalışmamızda örnek bir veri setinden faydalanarak hayali bir restoran için müşterilerden gelen geri bildirimleri olumlu- olumsuz olarak ayırt eden bir makine öğrenmesi çalışması gerçekleştirmeyi amaçlıyoruz.

1. Kütüphanelerin İmport Edilmesi →

Import Libraries

İlk olarak görselde de görüldüğü gibi çalışmada kullanacak olduğumuz kütüphaneleri import ediyoruz.

2. Veri Setinin İmport Edilmesi →

Import Dataset

Kütüphanelerimizi import ettikten sonra çalışmada kullanacak olduğumuz veri setimizi import ediyoruz. Burada bir fonksiyon kullanarak veri setimizi import ettik. Sonrasında ana veri setimizi korumak amacı ile df isminde kopya bir veri seti oluşturuyoruz.

3. Veri Setine ait Betimleyici İstatistikler →

Describtive Statistics of Dataset

Görselde de görüldüğü üzere 2 sütundan oluşan görece basit yapılı bir veri setimiz var. “Review” sütununda müşterilerin işletme hakkındaki yorumları; “Liked” sütununda ise müşterilerin yorumlarının olumlu(1) — olumsuz(0) değerleri bulunmakta. Son olarak veri setimiz 1000 müşterinin görüşünü içermekte olduğunu görüyoruz .(Bkz. restaurant_df.shape)

4. Veri Manipülasyonu ve Normalizasyon İşlemleri →

İlk olarak “Review” sütunundaki müşteri yorumlarını küçük harflere çevirelim.

Lowering for the values of Review column

Müşteri yorumlarının hepsini görüldüğü gibi küçük harfler olacak şekilde dönüştürdük.

Sonrasında ise yorumlardaki noktalama işaretlerinden kurtulalım.

Cleaning of the Punctuations

Bu aşamada sadece noktalama işaretleri değil metinsel öğelerin içindeki sayısal değerlerden de kurtulmuş olduk.

Sonraki aşamada türkçemizde edat olarak bildiğimiz harf topluluklarının ingilizcedeki karşılıkları olan “and, this, while” gibi ilgeçleri yorumlardan temizleyelim.

Cleaning of the Stopwords

İlgeçleri de sildikten sonra, yorumlarda çok az geçen ender derecesindeki kelimelerden kurtulalım.

Cleaning of the Rarewords

Ender geçen kelimeleri de veri setimizden temizledik. Sonraki aşamada tokenizasyon olarak bilinen ve yorum cümlelerindeki kelimeleri birer birer ayırarak veri setinde tutmamıza yarayan işlemi gerçekleştiriyor olacağız.

Tokenizasyon işlemi sayesinde metinsel öğeleri bilgisayarımızın anlayacağı hale getirebiliriz. Tokenizasyon işlemi kullanılmaz ise metin verilerini kurmuş olduğumuz makine öğrenmesi algoritması ve bilgisayarımız algılayamadığı için herhangi bir sonuç üretemeyiz, yada üretilmiş olunan sonuç gerçek sayılamaz . Aynı zamanda bu işlem, ortak kelimelerin eşlenmesi, öğrenmeyi saptırabilecek yaygın sözcükleri veya tekrarlanan sözcükleri veri setinden kaldırabilmek için oldukça faydalı bir işlemdir. Daha detaylı bilgi için bkz.

Tokenization

Cümleleri tokenize ettikten sonraki aşamada yine aynı cümleleri tüm yapım ve çekim eklerinden kurtarmak için lemmatization\ stemming işlemleri gerçekleştiriyoruz.

Biz çalışmamızda kelimelerdeki çekim eklerinden kurtararak kelimelerin sözlükteki hallerine göre sıralanmasını sağlamak amacı ile sadece lemmatization işlemi yapıyoruz.

Lemmatization\ Stemming Process

5. Veri Görselleştirme →

Veri setimiz üzerinde belirli veri manipülasyonu işlemlerini gerçekleştirdik. Sonrasında müşteri yorumlarını bilgisayarımızın anlayacağı hale getirdik ve çeşitli normalize işlemlerini tamamladık.

Sonraki aşamada ise Review sütunundaki yorumlar içinde en fazla geçen kelimelerin sıklık verisini kullanarak bir barplot çiziyoruz. Grafik, müşteri yorumlarında geçen kelimelerin kullanılma sıklıklarını göstermektedir.

Data Visualization -1-

Veri setimiz bir restorana gelen müşterilerin yorumlarını içerdiği için olarak “Food” kelimesinin frekansının bu kadar yüksek olması doğal olarak yorumlanabilir. Müşteri memnuniyetinin üst-orta seviyesinde olabileceğini de “Good” , “Great”, “Best” kelimelerine bakarak yorumlayabiliriz.

Bar plot görselleştirmesinden sonraki aşamada da restoran hakkında en fazla söylenmiş olan kelimeleri bir word cloud ile görselleştirelim.

The Syntaxes For Wordcloud
Word Cloud

6. Duygu Analizi →

Restoran hakkındaki görüşleri görselleştirdikten sonra, belirtilen yorumlar için duygu analizi olarak çevirebileceğimiz sentiment analizi gerçekleştiriyoruz. Böylece gelmiş olan müşterilerin restoran hakkındaki hissetmiş oldukları duyguları görebiliriz.

The Sentiment Analysis

Yukarıdaki görselde en üst satırda bulunan syntax çıktısına baktığımızda restoran hakkında müşteriler tarafından 0.577 oranında pozitif yorum belirtilmiş; 0.423 oranında nötr yorumlar belirtilmiştir. Negatif bir yoruma rastlanmamıştır. Görselin alt kısmındaki syntaxda ise müşteri yorumlarının her birinin ayrı ayrı duygu verileri yer almaktadır.

Polarity Scores

Bu görselde de müşteri yorumlarının polarity skoruna göre olumlu(1) ve olumsuz (0) olduğunu görebiliriz.

7. Duygu Modellemesi →

Duygu analizlerini gerçekleştirdik. Bundan sonraki aşamada ise önceki görselde görmüş olduğumuz olumlu olumsuz durumlara göre modelleme yapıyor olacağız.

Sentiment Modelling -1-

Yazmış olduğumuz syntax a göre bir yorum eğer ki 1 değerini almış ise positive; yok eğer 0 değerini almış ise negative olarak modellemesini istiyoruz. Sonrasında bunu tüm dataset e uyguluyoruz.

Apply for all data Sentiment Modelling

Yorumların positive ve negative olarak gruplayarak veri setindeki dağılımına bakalım.

Group By Liked Column

Az önceki görselleştirmelerde negatif bir yorum olmadığını görmüştük ancak düzenleme ile veri setindeki yorumların 0.75 ve 0.21 olarak dağıldığını görebiliriz.

Gruplama işlemini yaptıktan sonra Sentiment Label sütununu Label Encoder kullanarak sayısallaştırma işlemi yaptık. Daha sonrasında, yorumların bulunduğu Review sütununu X ve Sentiment Label sütununu da Y ekseni olarak aldık . Bu işlem daha sonra kelimeleri vektör haline getirmek için kullanacak olduğumuz Vectorizer yönteminde girdi olarak kullanılacaktır.

Label Encoder & Assaigning Axis by columns

8. Vektörleştirme ve Terim Sıklığı(TF-IDF) →

Label encoder işlemini de yaptıktan sonra kelimeleri, bazılarını kaldıracak şekilde ayrıştırarak belirlenmesi ve sonrasında makine öğrenmesi algoritmasında girdi olarak kullanılmak üzere bir tamsayı veya kayan nokta değeri olarak kodlanıyor olması gerekir. Bu işleme “Vektörleştirme” denir. Vektörleştirme işlemi için ise Scikit-learn kütüphanesi içinde bulunan CountVectorizer() kulllanılır.

Count Vectorizer

Vektörleştirme işlemini yaptıktan sonra ise tam karşılığı olmasa da Terim Sıklığı olarak çevirilen TF-IDF olarak da bilinen işlemi gerçekleştireceğiz.

TF-IDF (Term frequency–Inverse Document Frequency), sözcüğün bulunduğu dökümanı ne kadar temsil ettiğini gösteren bir istatistiksel değerdir. TF, DF ve IDF kısımlarını ayrı ayrı açıklayalım.

TF(Terim Sıklığı), İlgili kelimenin dökümandaki frekansıdır. Kelimenin dökümanda geçme sayısını, dökümandaki toplam kelime sayısına bölerek elde edilir.

DF(Doküman Sıklığı), TF ile benzemektedir ama bu kez diğer dökümanlara odaklanır. Döküman sayısının ilgili kelimenin geçtiği döküman sayısına bölünmesi ile hesaplanır.

IDF(Ters Doküman Sıklığı), DF değerinin logaritması alınarak hesaplanır.Bir kelime diğer dökümanlarda ne kadar sık geçiyorsa DF değeri artar, IDF değeri o kadar azalır.

Formula of IDF

Terminolojik olarak açıkladıktan sonra işlemimizi gerçekleştirelim.

Processes of DF, IDF

9. Makine Öğrenmesi Algoritmaları →

Çalışmamız kapsamında, Lojistik Regresyon ve Random Forest Classifier olmak üzere iki farklı makine öğrenmesi algoritmasından faydalanılmıştır. Her iki algoritmanın da accuracy score değerleri karşılaştırılmış ve Random Forest algoritmasının accuracy score değeri 0.002 fark ile daha yüksek çıkmıştır. Çalışma sonunda random forest algoritmasını kullanarak yazacak olduğumuz bir yorumu doğru değerlendirip değerlendirmediğini test ediyor olacağız.

İlk olarak lojistik regresyon algoritması ile başlayalım.

9.1. Lojistik Regresyon →

Logistic Regression Model

Görselde, lojistik regresyon modeli kurulmuş ve çapraz doğrulama skoru olarak 0.8219 değeri elde edilmiştir. 2. Syntax da ise olumlu olarak kabul görmüş bir örnek çekilmiş ve bu örneğin “Pretty Good Beer Selection” olduğu görülmektedir.

Diğer algoritmamız olan Random Forest algoritmasını da gerçekleştirelim.

9.2. Random Forest Classifier →

Random Forest Classifier

Görseldeki çapraz doğrulama skorundan sonra daha öncesinde gerçekleştirmiş olduğumuz TF-IDF işleminin çıktısı olarak kabul ettiğimiz X_tf_idf_word train verisine göre yeniden fit ediyoruz ve yeni bir çapraz doğrulama skoru elde ediyoruz.

The Second wave of Random Forest Classifier

Sonrasında n_gram range parametresini tanımlayarak oluşturduğumuz X_tf_idf_ngram train setini kullanarak bir kez daha fit ediyoruz.

Fitting with n_gram parameter

Son elde etmiş olduğumuz skor değerimiz 0.805 olarak görülmektedir. Bu aşamadan sonra random forest için hiperparametreleri tanımlayıp yeniden eğitiyoruz.

Final result of Random Forest Algorithm

Çalışmada kullandığımız algoritmaların isabet skorlarını karşılaştıralım ve görselleştirelim.

Compare of the Algorithms

Görüldüğü gibi random forest algoritması 0.90 düzeyinde isabet skoruna sahiptir. Lojistik regresyon algoritması ise yalnızca 0.82 de kalmıştır. Yapmış olduğumuz öğrenim sürecini kendimizin oluşturacağı bir müşteri yorumu ile test edip doğru çalışıp çalışmadığını kontrol edebiliriz.

10. Sonuç ve Test →

Testing Random Forest

Algoritmaya girdi olarak sunduğumuz “This Place look like Wonderland” cümlesini olumlu mu olumsuz mu olduğunu görmek istedik ve son syntax satırının (rf_model.predict(comment_toarray)) çıktısı olarak [1] değerinin döndüğünü görüyoruz. Algoritmamız doğru şekilde tahmin yapabilmekte.

Bu makalenin yazımında danışmanım olarak beni destekleyen değerli mentorum Alparslan Mesri’ye teşekkürler.

--

--