|
# -*- coding: utf-8 -*- |
|
"""dogaldilislemefinal.ipynb |
|
|
|
Automatically generated by Colaboratory. |
|
|
|
Original file is located at |
|
https://colab.research.google.com/drive/1y11a5nqCyrTjdYTrmVZfaskBA9BMf70- |
|
|
|
# Bağlantı |
|
""" |
|
|
|
!apt-get install -y -qq software-properties-common python-software-properties module-init-tools |
|
!add-apt-repository -y ppa:alessandro-strada/ppa 2>&1 > /dev/null |
|
!apt-get update -qq 2>&1 > /dev/null |
|
!apt-get -y install -qq google-drive-ocamlfuse fuse |
|
from google.colab import auth |
|
auth.authenticate_user() |
|
from oauth2client.client import GoogleCredentials |
|
creds = GoogleCredentials.get_application_default() |
|
import getpass |
|
!google-drive-ocamlfuse -headless -id={creds.client_id} -secret={creds.client_secret} < /dev/null 2>&1 | grep URL |
|
vcode = getpass.getpass() |
|
!echo {vcode} | google-drive-ocamlfuse -headless -id={creds.client_id} -secret={creds.client_secret} |
|
|
|
!mkdir -p drive |
|
!google-drive-ocamlfuse drive |
|
!ls |
|
|
|
"""# Kütüphaneler""" |
|
|
|
import pandas as pd |
|
import numpy as np |
|
from sklearn.feature_extraction.text import CountVectorizer |
|
import string #noktalama işaretleri |
|
import re |
|
import nltk #etkisiz kelimeler |
|
import numpy |
|
import csv |
|
import pandas as pd |
|
import os, glob |
|
from nltk.corpus import stopwords |
|
from sklearn.model_selection import train_test_split |
|
from sklearn.feature_extraction.text import TfidfTransformer |
|
from sklearn.naive_bayes import MultinomialNB |
|
from bs4 import BeautifulSoup |
|
import requests |
|
|
|
"""# Veri ayrıştırma/ Parse |
|
|
|
Bot engeline karşı |
|
""" |
|
|
|
headersparam = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Firefox/78.0"} |
|
|
|
"""Siteden format değiştirme ve çekme""" |
|
|
|
# sadece trendyolun tüm yorumlar sayfası için çalışır!!! |
|
r = requests.get("https://www.trendyol.com/apple/airpods-2-nesil-bluetooth-kulaklik-mv7n2tu-a-apple-turkiye-garantili-p-6405631/yorumlar?boutiqueId=561660&merchantId=106299", headers=headersparam) |
|
yorum =r.content |
|
soup = BeautifulSoup(yorum,"html.parser") |
|
|
|
"""İlk pars işlemleri""" |
|
|
|
# Farklı siteler için "div" ve "attrs" kısımları o sayfaya göre özelleştirilmeli |
|
a= soup.find_all("div",attrs={"class":"pr-rnr-com"}) |
|
|
|
"""Ayrıştırılmış verileri sıra ile diziye kayıt etme""" |
|
|
|
Liste=[] |
|
for i in a: |
|
b = i.find_all("div",attrs={"class":"rnr-com-w"}) |
|
for j in b: |
|
yorum1=j.find("div",attrs={"class":"rnr-com-tx"}).text.strip() |
|
#begeni = i(" ") |
|
#tarih=i.find("span",attrs={"class":"rnr-com-usr"}).span.next_sibling |
|
|
|
#satisdurumu=i.find("span",attrs={"class":"rnr-com-usr"}).next_sibling.text |
|
|
|
#alici=i.find("span",attrs={"class":"rnr-com-usr"}).span.previous_sibling |
|
|
|
#satici=i.find("span",attrs={"class":"seller-name-info"}).text |
|
|
|
#begenisayisi=i.find("div",attrs={"class":"rnr-com-like"}).span.next_sibling.text |
|
|
|
#Liste.append([yorum1,tarih,satisdurumu,alici,satici,begenisayisi]) |
|
Liste.append([yorum1]) |
|
|
|
"""Diziyi dataframe etme""" |
|
|
|
df = pd.DataFrame(Liste) |
|
#df.columns=["Yorumlar","Tarih","Durum","Müşteri","Satıcı","Beğeni"] |
|
df.columns=["Yorumlar"] |
|
|
|
"""Doğruluk testi""" |
|
|
|
df |
|
|
|
"""Excel formatında kayıt etme""" |
|
|
|
df.to_excel('/content/drive/Colab Notebooks/trendyolveri/hamveri.xlsx') |
|
|
|
"""# Veri Seti Yükleme""" |
|
|
|
# csv den veri yükleme |
|
|
|
from openpyxl import Workbook,load_workbook |
|
yorumlar = pd.read_excel('/content/drive/Colab Notebooks/trendyolveri/trendyolverislenmis.xlsx') |
|
yorumlartest = pd.read_excel('/content/drive/Colab Notebooks/trendyolveri/hamveri.xlsx') |
|
|
|
#ilk beş girdi görmek için |
|
yorumlar.head() |
|
#yorumlartest.head() |
|
|
|
"""# Veri Seti Önişleme""" |
|
|
|
nltk.download('stopwords') # önemliiiii |
|
noktalama = string.punctuation |
|
etkisiz = stopwords.words('turkish') |
|
print(noktalama) |
|
print(etkisiz) |
|
|
|
"""# Eğitim verileri""" |
|
|
|
#yorumdizim=[] |
|
#likedizim=[] |
|
for d in yorumlar['Yorumlar'].head(): |
|
print(d+ '\n------------------------------') |
|
# Etkisiz kelimeleri atmak |
|
temp= ' ' |
|
for word in d.split(): |
|
if word not in etkisiz and not word.isnumeric(): |
|
temp += word + ' ' |
|
#yorumdizim.append(temp) |
|
#yorumcsv = pd.DataFrame(yorumdizim) |
|
#data1 = yorumcsv.to_excel |
|
print(temp+ '\n********************') |
|
|
|
"""Noktalama işaretleri silme""" |
|
|
|
for d in yorumlar['Yorumlar'].head(): |
|
print(d+ '\n------------------------------') |
|
# Noktalama işaretleri atma |
|
temp= ' ' |
|
for word in d: |
|
if word not in noktalama: |
|
temp += word |
|
#yorumdizim.append(temp) |
|
print(temp+ '\n********************') |
|
d= temp |
|
|
|
"""# Test verileri""" |
|
|
|
for d in yorumlartest['Yorumlar'].head(): |
|
|
|
print(d+ '\n------------------------------') |
|
# Etkisiz kelimeleri atmak |
|
temp= ' ' |
|
for word in d.split(): |
|
if word not in etkisiz and not word.isnumeric(): |
|
temp += word + ' ' |
|
#yorumdizim.append(temp) |
|
#yorumcsv = pd.DataFrame(yorumdizim) |
|
#data1 = yorumcsv.to_excel |
|
|
|
print(temp+ '\n********************') |
|
|
|
for d in yorumlartest['Yorumlar'].head(): |
|
print(d+ '\n------------------------------') |
|
# Noktalama işaretleri atma |
|
temp= '' |
|
for word in d: |
|
if word not in noktalama: |
|
temp += word |
|
#yorumdizim.append(temp) |
|
print(temp+ '\n********************') |
|
d= temp |
|
|
|
"""# Verileri kayıt etme""" |
|
|
|
#df = pd.DataFrame(yorumdizim) |
|
#df.columns=["Yorumlar","Tarih"] |
|
#print(df) |
|
|
|
yorumlar.to_csv('/content/drive/Colab Notebooks/trendyolveri/cleaned.csv', index = False) |
|
yorumlartest.to_csv('/content/drive/Colab Notebooks/trendyolveri/cleanedtest.csv', index = False) |
|
|
|
yorumlar = pd.read_csv('/content/drive/Colab Notebooks/trendyolveri/cleaned.csv') |
|
yorumlartest = pd.read_csv('/content/drive/Colab Notebooks/trendyolveri/cleanedtest.csv') |
|
|
|
print(yorumlar.head()) |
|
|
|
"""# Veri Setini Bölme""" |
|
|
|
# Arındırılmış veriyi train ve test kümelerine ayırıyoruz |
|
# Eğitim ve test olarak ayıracağız. train=eğitim, test=test |
|
|
|
X_train, X_test, y_train, y_test = train_test_split(yorumlar['Yorumlar'].values.astype('U'),yorumlar['begeni'].values.astype('U'), test_size=0.1, random_state=42) |
|
# XX_train işimize yaramıyor. |
|
XX_train, XX_test = train_test_split(yorumlartest['Yorumlar'].values.astype('U'), test_size=0.9, random_state=42) |
|
print(X_train.shape) |
|
print(XX_test.shape) |
|
|
|
"""# Sayma Vektörü Oluşturma""" |
|
|
|
# Train kümesindeki cümlelerin sayma vektöelerini çıkarıyoruz |
|
count_vect = CountVectorizer(max_features = 20000) # Burası önemli ram için |
|
X_train_counts = count_vect.fit_transform(X_train) |
|
print(X_train_counts.shape) |
|
|
|
"""Tf*Idf vektörü oluşturma |
|
sadece o yoruma özgü(temsil edecek kelimler olmalı) |
|
""" |
|
|
|
# Train kümesindeki cümlelerin TF*IDF vektörlerini sayma vekttörlerinden oluşturuyoruz |
|
# Tf= terim sıklığı, IDF= bir kelimenin dökümanda kaç kere geçtiği |
|
# TF*IDF bütün olarak; bir kelimenin bir döküman içinde ki önemini gösterir |
|
tfidf_transformer = TfidfTransformer() |
|
X_train_tfidf = tfidf_transformer.fit_transform(X_train_counts) |
|
print(X_train_tfidf.shape) |
|
|
|
"""# Naive Bayes Model Eğitimi""" |
|
|
|
# Çok modlu Naive Bayes Sınıflandırıcısı eğitiyoruz |
|
clf = MultinomialNB().fit(X_train_tfidf, y_train) |
|
XX_test_counts = count_vect.transform(XX_test) |
|
XX_test_tfidf = tfidf_transformer.transform(XX_test_counts) |
|
|
|
"""# Model Performansı Ölçme""" |
|
|
|
# Sınıflandırıcı ile test seti üzerindeki tahminleme yapıyoruz |
|
y_pred = clf.predict(XX_test_tfidf) |
|
for review, sentiment in zip(XX_test[:], y_pred[:]): |
|
print('%r => %s' % (review, sentiment)) |
|
|
|
"""# Grafik""" |
|
|
|
# Performans sonuçları |
|
# Veri seti bölme aşamasında kümelemeler eşit olmadığı için bu kısım hata verebilir!! |
|
from sklearn.metrics import accuracy_score |
|
|
|
print(accuracy_score(XX_test, y_pred)) |
|
|