Python ile PDF’den Veri Çıkararak Metin Ön İşleme Teknikleri, Çeviri ve Word Cloud

Yiğit Şener
Data Runner
Published in
4 min readOct 17, 2020

Günümüzde metin madenciliği (text mining) teknikleri makine öğrenmesi ve yapay zeka alanlarında kullanımı oldukça artmaktadır. Bu alanda yapılan çalışmaların en önemli iki başlangıç noktası bulunuyor. Birincisi veriye erişebilme, ikincisi ise erişilen metinlerden anlamlı donelerin çıkarılması için doğru ön işleme süreçlerinin gerçekleştirilmesi.

Bu yazıda PDF formatında saklanan örnek bir İngilizce makalenin metinlerine nasıl erişildiğini anlatıp ön işleme süreçlerinden bahsettikten sonra Türkçe karşılığındaki sözcüklerin bir Word Cloud’unu oluşturacağım.

Öncelikle gerekli kütüphaneleri kuralım.

import PyPDF2 
import nltk
from googletrans import Translator
from wordcloud import WordCloud
import matplotlib.pyplot as plt
# Aşağıdaki kodu tek seferliğine çalıştırınız
# nltk.download('words')

PyPDF2 kütüphanesi PDF dosyalarında okuma ve yazma işlemlerinin yapılmasını sağlıyor. nltk metinleri ön işlemden geçirmede son derece popüler bir kütüphanedir. googletrans adından anlaşılacağı üzere cümle ya da kelime çevirisi yapmada kullanılan bir google API’sidir. Bu kütüphane ile ilgili rehbere yazının sonundaki linklerden erişebilirsiniz.

Sözcüklerini damıtacağımız PDF dosyasına buradaki linkten erişebilirsiniz.

Endüstri 4.0 ile ilgili bir makaleyi buradan indirerek kodun çalıştığı dizine kaydettim. Siz ister bu makaleyi isterseniz başka bir PDF dosyasını kullanabilirsiniz. İşlemlerimize sırasıyla başlayalım.

# dosya yolu/adı
file_name = "i4_0.pdf"

# PDF dosyasının açılması
pdfFileObj = open(file_name, 'rb')

# PDF dosyasının okunması
pdfReader = PyPDF2.PdfFileReader(pdfFileObj)

# PDFin sayfa sayısı
numPages = pdfReader.numPages

PyPDF2 kütüphanesinden yararlanarak yukarıdaki kodda görüldüğü üzere PDF dosyasını okutup toplam sayfa sayısını aldık.

# boş text formatı
text = ""

# sayfa sayısı kadar range(döngü sayısı) verildi
# -2 koyulmasının sebebi son 2 sayfanın alınmak istenmemesi
for i in range(numPages - 2):
# her sayfa için text okunuyor
pageText = pdfReader.getPage(i).extractText()
# okunan text eskisine eklenir
text = text + " " + (pageText)

Tüm sayfalar için tek tek metin çıkarma işleminin yapılması sebebi ile for döngüsünü kullandık. Ancak makalenin sonundaki kaynakça bölümünü elemek için sayfa sayısını 2 azalttık.

Çıkan sonucun bir kısmına bakalım

# Örneklem bakalım
text[:100]
# ÇIKTI: ' Jour of Adv Research in Dynamical & Control Systems, Vol. 10, 14\n-\nSpecial Issue, 2018\n \nISSN 1943'

Harfler, rakamlar ve garip işaretlerle dolu bir text dosyası şimdi bunları nasıl temizleyeceğimize bir bakalım.

# Tokenların ayrışması
words_list = nltk.tokenize.word_tokenize(text, language="english")
print(words_list[:10])
# ÇIKTI:
# ['Jour', 'of', 'Adv', 'Research', 'in',
# 'Dynamical', '&', 'Control', 'Systems', ',']
print(len(words_list))
# ÇIKTI: 4857

Şimdi artık nltk kütüphanesine geçtik. bu kütüphaneden faydalanarak ilk olarak kelimeleri (token) ayrıştırdık.

İçerisinde harf geçenleri ayrıştıran fonksiyonu yazalım.

words_list = [word.lower() for word in words_list if word.isalpha()]
print(words_list[:10])
# ÇIKTI:
# ['definitions', 'accessed', 'before', 'of'
# 'smartly', 'car', 'how', 'above', 'corporate', 'n']
print(len(words_list))
# ÇIKTI: 3914

Görüldüğü üzere listedeki kelime sayısı 4857'den 3914'e düştü.

Stop words kelimelerini kaldıralım. Bunlara örnek olarak aşağıdakiler gösterilebilir.

  • ‘some’, ‘her’, ‘she’, ‘against’, ‘are’, ‘an’, ‘hadn’,
# stop words
stop_words = set(nltk.corpus.stopwords.words('english'))
words_list = [word for word in words_list if not word in stop_words]
print(words_list[:10])
# ÇIKTI:
# ['definitions', 'accessed', 'before',
# 'smartly', 'car', 'how', 'above', 'corporate']

print(len(words_list))
# ÇIKTI: 2495

Stopwords’ler çıkarıldıktan sonra kelime sayımız 2495 adede gerilemiştir.

Kelimenin eklerini çıkararak sadeleştiren Lemmatizer yöntemini kullanarak sözcükleri asıl anlamlarına dönüştüreceğiz.

wn_lemma = nltk.WordNetLemmatizer()
words_list = [wn_lemma.lemmatize(word) for word in words_list]
print(words_list[:10])
# ÇIKTI:
# ['research', 'dynamical', 'control',
# 'system', 'vol', 'special', 'issue']

print(len(words_list))
# ÇIKTI: 2495

Yukarıda görüldüğü üzere örneğin definitions kelimesi ‘s’ (çoğul) takısını atarak definition olarak dönüştürülmüştür.

Bir kelimede bulunan harf sayısı en az 3 olan koşul ile birlikte ingilizce kelime olup olmadığını kontrol eden fonksiyonu yazalım.

# ingilizce kelimeler seçilir.
check_words = nltk.corpus.words.words()
words_list = [word for word in words_list if word in check_words]
print(words_list[:10])
# ÇIKTI:
# ['research', 'dynamical', 'control', 'system',
# 'vol', 'special', 'issue', 'received', 'overview', 'industry']
print(len(words_list))
# ÇIKTI: 1905

Kelime sayımız 2495'ten 1905'e düşmüştür. Giderek daha değerli bir sözlük listesine erişmiş oluyoruz. Tekil kelime adedine bir bakalım

# SET kelimleri tekilleştirir
print(len(set(words_list)))
# ÇIKTI: 715

Önce İngilizce sonra da çeviri işleminden sonra Türkçe Word Cloud yapalım.

# matplotlib ile wordcloud
wordcloud = WordCloud(width=1000, height=500, regexp=r"\w[\w' ]+").generate("+".join(words_list))
plt.figure(figsize=(15,8))
plt.imshow(wordcloud)
plt.axis("off")
plt.show()

İngilizce kelimeleri Türkçeye çeviren kodumuzu yazalım

# Çeviren nesneyi tanımlıyoruz.
translator = Translator()
# Liste içinde her bir kelime için türkçe karşılığı getiriliyor
words_tr = [translator.translate(word, dest="tr").text for word in words_list]
# Karşılık bulunamayan kelimleer çıkarılıyor.
words_tr = [word for word in words_tr if word not in words_list]
print((words_tr[:10]))
# ÇIKTI:
# ['Araştırma', 'dinamik', 'kontrol', 'sistemi', 'cilt', 'özel',
# 'konu', 'Alınan', 'genel bakış', 'endüstri']

print(len(words_tr))
# ÇIKTI: 1298

Kodda görüldüğü üzere 1298 tane sözcük başarılı olarak Türkçe diline çevrildi. Word Cloud olarak bakalım.

wordcloud = WordCloud(background_color='white',
max_font_size = 50,
collocations=False).generate(" ".join(words_tr))
plt.figure(figsize=(15,8))
plt.imshow(wordcloud)
plt.axis("off")
plt.show()

Sonuç

Metin işleme dünyasında oldukça fazla işe yarar araç var. Ne var ki Türkçe dili için henüz geliştirilmiş çok kapsamlı paketler bulunmuyor. Her proje yahut kurum kendi çabaları ile kapalı bir şekilde bu çalışmalarını yürütüyorlar. Bununla beraber açık kaynaklı Türkçe dil-metin anlama/işleme süreçlerine yapılacak katkılar ülkedeki tüm makine öğrenmesi ve yapay zeka çalışmalarına katkıda bulunacaktır.

Diğer Yazılarım:

--

--