Skip to content

Latest commit

 

History

History
224 lines (177 loc) · 10.1 KB

README.md

File metadata and controls

224 lines (177 loc) · 10.1 KB

🎯 Açık Hack 2020 | COVID-19 Özel Uygulaması 🎯

Kesf i Lisan Uygulaması

Demo Linki

Sunum Linki

License: MIT

Detaylar

Gerekli Kütüphane ve Araçlar Version
Python 3.x
NLTK 3.5
Re 2020.7.14
Spacy 2.3.2
Torch 1.6.0
Pandas 1.1.0
Numpy 1.19.1
Networkx 2.4
Scikit-learn 0.23.1
Seaborn 0.10.1
Requests 2.24.0
Httplib2 0.18.1
Urllib3 1.25.10

Ortam Kurulumu - Adım 0

Keşf-i Lisans projesi sıfırdan metin toplama, metin sınıflandırma ve metin özetleme gerçekleştirmenizi mümkün kılar. Proje süresince miniconda https://docs.conda.io/en/latest/miniconda.html kullanılmasını öneriyoruz.

PyTorch kurulumu için;

conda install pytorch torchvision cudatoolkit=10.2 -c pytorch
git clone https://github.com/Kesf-i-Lisan/AcikHack2-COVID-19-Uygulamasi

🚀 Kaynak Kökü Toplama - Adım 1

Veri toplamanın en önemli kısmı çok sayıda kaynağa sahip olmaktır. Yani tutarlı ve özgün içerik üreten web linklerine ulaşmaktır. Bunun için Adım 2 deki yöntemin dışında yani kök dizin vermek dışında, linkleri listeler halinde elde ederek kullanabilirsiniz.

def link_getirici_yontem_algoritma_1(arama_metni):
    sorgu_sayfa_sonucu = requests.get("https://www.google.dz/search?q="+str(arama_metni))
    soup_nesnesi = BeautifulSoup(sorgu_sayfa_sonucu.content)
    import re
    links = soup_nesnesi.findAll("a")
    for link in links:
        print(link["href"])
def link_getirici_google_import(arama_metni):
    link_tamponu = []
    for yineleyici in search(arama_metni, tld="co.in", num=4, stop=100, pause=8):
        link_tamponu.append(j)
        print(yineleyici)

🚀 Metin Toplama - Adım 2

Ön gereksinimleri için text_scraping klasörü altında bulunan requirements.txt klasöründe bulunan kütüphaneler kurulmalıdır. pip install -r requirements.txt Metin özetleme aracı mevcut olarak 4 site desteklemektedir. -CNN -Milliyet -NTV -BBC

Metin toplayabilmek için list_of_link.txt dosyasına her satıra bir link gelecek biçimde kök linkleri yazınız. Ardından uygulama tüm kök link ve alt linkleri gezerek metin toplama işlemini gerçekleştirecektir.

python get_text_from_CNN.py

🚀 Metin Toplama - Adım 2 - Önemli Opsiyonel

Veri toplama işlemi konusunda herhangi bir sınır yaşamak istemiyorsanız aşağıdaki yöntemi kullanarak normalizasyon süreçlerine ayrıca dallanmadan temiz veriler toplabilir. Toplanmış olan çıktıları özetleme algoritması içerisinde kullanabilirsiniz.

from bs4 import BeautifulSoup,SoupStrainer
import urllib.request
import urllib
from lxml import html


normalizasyon_boyut_kriteri = 30
def linkden_metin_getir_Detayli_normalizasyon(giden_link):
    html_nesnesi = urllib.request.urlopen(giden_link)
    soup_nesnesi = BeautifulSoup(html)

    for script in soup_nesnesi(["script", "style"]):
        script.extract()

    metin = soup_nesnesi.get_text()
    satir_parcalari = (line.strip() for line in metin.splitlines())
    icerik_parcalari = (phrase.strip() for satir_parcasi in satir_parcalari for phrase in satir_parcasi.split("  "))
    for yineleyici_parcacik in icerik_parcalari:
        if len(yineleyici_parcacik) > normalizasyon_boyut_kriteri:
            print(yineleyici_parcacik)

🚀 Metin Normalizasyonu - Adım 3

Toplanan metinler genellikle NLP çalışmaları için istenmeyen pek çok karakter içerir. Normalizer.py modülünde yer alan fonksiyonlar yardımı ile toplanan metinleri kolaylıkla normalize etmek mümkün.

Basit Kullanım

import Normalizer
text = "Bu bir - test Metnidir."
result = Normalizer.normalize(text)
print("Çıktı: ",result)

Çıktı: bu bir test metnidir

Geliştirilen Normalizasyon uygulaması Türkçe için özel normalizasyonlar içermektedir. number2string -> Metin içerisinde yer alan bütün sayıları Türkçe kelime karşılığına dönüştürür. date2string -> Tarih formatında yazılan ifadeleri Türkçe gün-ay-yıl formatına dönüştürür. time2string -> Saat formatonda yazılan ifadeleri Türkçe rakam formatına dönüştürür.

🚀 Extractive Özetleme - Adım 4

Algoritmamız Türkçe haber metinleri üzerinde özetleme yapan algoritma aşağıdaki şekildedir. Bu algoritma metin içerisindeki en önemli cümleleri kelime sıklık matrisleri oluşturarak seçmektedir.

def ozetle(self,metin):
        vektor_islemleri = CountVectorizer()
        vektor_islemleri_matrisi = vektor_islemleri.fit_transform(metin)

        deger_matrisi = TfidfTransformer().fit_transform(vektor_islemleri_matrisi)
        cozunurluk_grafi = deger_matrisi * deger_matrisi.T
        cumle_vektor_graf_yapisi = graf_manipulasyonu.from_scipy_sparse_matrix(cozunurluk_grafi)
        graf_manipulasyonu.draw_circular(cumle_vektor_graf_yapisi)
        cumlelerin_graf_dereceleri = graf_manipulasyonu.pagerank(cumle_vektor_graf_yapisi)


        cikti_cumle_dizisi = sorted(((cumlelerin_graf_dereceleri[yineleyici_graf_2], s) for yineleyici_graf_2, s in enumerate(ayristirilmis_cumle_listesi)), reverse=True)
        cikti_cumle_dizisi = np.asarray(cikti_cumle_dizisi)

        derece_azami  = float(cikti_cumle_dizisi[self.indis_degeri_0][self.indis_degeri_0])
        derece_asgari = float(cikti_cumle_dizisi[len(cikti_cumle_dizisi) - 1][self.indis_degeri_0])


        if derece_azami - derece_asgari == 0:
            self.genel_islem_dizisi_tamponu.append(0)
            self.derece_durum_rolesi = 1
        if self.derece_durum_rolesi != 1:
            for yineleyici_ekleme in range(0, len(cikti_cumle_dizisi)):
                self.genel_islem_dizisi_tamponu.append((float(cikti_cumle_dizisi[yineleyici_ekleme][self.indis_degeri_0]) - derece_asgari) / (derece_azami - derece_asgari))

        uzunluklar_esigi_degeri = (sum(self.genel_islem_dizisi_tamponu) / len(self.genel_islem_dizisi_tamponu)) + 0.2

        ozetlenecek_cikti_cumleleri = []
        if len(self.genel_islem_dizisi_tamponu) > 1:
            for yineleyici_ozetleme in range(0, len(self.genel_islem_dizisi_tamponu)):
                if self.genel_islem_dizisi_tamponu[yineleyici_ozetleme] > uzunluklar_esigi_degeri:
                    ozetlenecek_cikti_cumleleri.append(cikti_cumle_dizisi[yineleyici_ozetleme][self.indis_degeri_1])
        else:
            ozetlenecek_cikti_cumleleri.append(cikti_cumle_dizisi[self.indis_degeri_0][self.indis_degeri_1])

        dokuman_ozeti = " ".join(str(x) for x in ozetlenecek_cikti_cumleleri)
        return dokuman_ozeti

Harici dokümanlar üzerinde uygulanabilir:

    def dokuman_ozetle(self,dosya_ismi):
        icerigi_yakalanan_dokuman = self.dokuman_icerigini_yakala(dosya_ismi)
        ayristirilmis_cumle_listesi = self._cumle_ayristirma_islemi(icerigi_yakalanan_dokuman)
        self.ozet = self.ozetle(ayristirilmis_cumle_listesi)
        return self.ozet

Kullanım

import extractive_ozetleme

ozetleme = extractive_ozetleme.extractive_ozetleme()
dokuman = open("deneme.txt","r").readlines()
dokuman_ozeti = ozetleme.dokumen_ozetle(dokuman)

Doğrudan metinler üzerinde uygulanabilir:

    def metin_ozetle(self,metin):
        ayristirilmis_cumle_listesi = self._cumle_ayristirma_islemi(metin)
        self.ozet = self.ozetle(ayristirilmis_cumle_listesi)
        return self.ozet

Kullanım

import extractive_ozetleme

ozetleme = extractive_ozetleme.extractive_ozetleme()
metin = "Bir test metni"
ozet = ozetleme.metin_ozetle(metin)

🚀 Metin Sınıflandırma- Adım 5

Etiketsiz toplanan metinlerin sınıflandırılması için, etiketli Türkçe haber verilerinden oluşan veri kümesi kullanılarak PyTorch ile sınıflandırma çalışması gerçekleştirilmiştir.

Eğitim süresince 42bin_haber veri kümesi kullanılmıştır. Veri kümesini bu bağlantıdan indirebilirsiniz. https://drive.google.com/file/d/1wOoIHiQzCyk5p7ZieXkiDCHAtA3GmcUX/view?usp=sharing

Yapılan eğitimde dünya, ekonomi, genel, magazine, saglık, spor, Türkiye kategorilerindeki verilerden oluşan 7 farklı sınıf kullanulmıştır. Eğitim sonucu %89 eğitim %71 test başarısı elde edilmiştir.

✨ Demo Bileşenleri

📝 Takım Üyeleri

@KürşatCAKAL @CanKORKUT

📝 Lisans

[MIT]
Copyright © 2020 Kesf_i_Lisan.