Zemberek Kütüphanesi Python’da Nasıl Kullanılır ?

Burak Tahtacı
3 min readSep 26, 2020

--

Doğal Dil İşleme, makine öğrenmesi alanında son yıllarda oldukça popüler olan bir alan. Ancak diğer makine öğrenmesi yöntemlerinde pek sık rastlanılmayan bir lokalizasyon problemi mevcut. Yani İngilizce’de geliştirilmiş bir kütüphaneler, kaynaklar ve SDK’lar genellikle yalnızca İngilizce metinlerde çalışıyor. Hal böyle olunca her dil için o dilin kendi yapısında uygun metin işleme algoritmaları ve kütüphaneleri geliştirmek gerekli oluyor.

Türkçe için geliştirilmiş pek çok doğal dil işleme kütüphanesi mevcut olmasına karşın sahip olduğu özellikler ve kullanım kolaylığı açısından zemberek projesi en sık kullanılan doğal dil işleme kütüphanelerinden biri olarak karşımıza çıkıyor.

Zemberek Java ile geliştirilmiş bir yazılım ve içinde bir çok modüle sahip bir kütüphane. Zemberek’in sahip olduğu modüller hakkındaki bilgiler zemberek github hesabında mevcut. Bu yazının amacı Java dışındaki bir dilde zemberek’i nasıl kullanacağımızı açıklamak. Hadi başlayalım.

Zemberek’i geliştiren ekip zemberek methodlarını dışarıya açabilmek için dahili bir gRPC sunucusu geliştirmişler. (gRPC hakkında detaylı bilgi için bu websitesini ziyaret edebilirsiniz.) Aşağıdaki adımları takip ederek siz de kendi makinenizde bir docker konteyneri ayağa kaldırıp zemberek gRPC servisine erişebilirsiniz.

docker run -d --rm -p 6789:6789 -p 6790:6790 --name zemberek-grpc ryts/zemberek-grpc

Yukarıdaki komutu çalıştırdıktan sonra zemberek-grpc sunucunuz hazır olacaktır.(Sunucunun isteklere yanıt verebilmesi için ilk açılışta 30 saniye gibi bir zaman geçmesi gerekiyor) Ardından Python kodu içinden sunucumuza istek atmak için gerekli kütüphaneyi kuralım.

pip3 install zemberek-grpc

Kütüphane kurulduktan sonra aşağıdaki kod örneklerini çalıştırarak Zemberek kütüphanesine Python kodu içerisinden erişebilmeniz mümkün.

import sys

import grpc

import zemberek_grpc.language_id_pb2 as z_langid
import zemberek_grpc.language_id_pb2_grpc as z_langid_g
import zemberek_grpc.normalization_pb2 as z_normalization
import zemberek_grpc.normalization_pb2_grpc as z_normalization_g
import zemberek_grpc.preprocess_pb2 as z_preprocess
import zemberek_grpc.preprocess_pb2_grpc as z_preprocess_g
import zemberek_grpc.morphology_pb2 as z_morphology
import zemberek_grpc.morphology_pb2_grpc as z_morphology_g

channel = grpc.insecure_channel('localhost:6789')

langid_stub = z_langid_g.LanguageIdServiceStub(channel)
normalization_stub = z_normalization_g.NormalizationServiceStub(channel)
preprocess_stub = z_preprocess_g.PreprocessingServiceStub(channel)
morphology_stub = z_morphology_g.MorphologyServiceStub(channel)

def find_lang_id(i):
response = langid_stub.Detect(z_langid.LanguageIdRequest(input=i))
return response.langId

def tokenize(i):
response = preprocess_stub.Tokenize(z_preprocess.TokenizationRequest(input=i))
return response.tokens

def normalize(i):
response = normalization_stub.Normalize(z_normalization.NormalizationRequest(input=i))
return response

def analyze(i):
response = morphology_stub.AnalyzeSentence(z_morphology.SentenceAnalysisRequest(input=i))
return response;

def fix_decode(text):
"""Pass decode."""
if sys.version_info < (3, 0):
return text.decode('utf-8')
else:
return text

def run():
lang_detect_input = 'merhaba dünya'
lang_id = find_lang_id(lang_detect_input)
print("Language of [" + fix_decode(lang_detect_input) + "] is: " + lang_id)

print("")
tokenization_input = 'Merhaba dünya!'
print('Tokens for input : ' + fix_decode(tokenization_input))
tokens = tokenize(tokenization_input)
for t in tokens:
print(t.token + ':' + t.type)

print("")
normalization_input = 'Mrhaba dnya'
print('Normalization result for input : ' + fix_decode(normalization_input))
n_response = normalize(normalization_input)
if n_response.normalized_input:
print(n_response.normalized_input)
else:
print('Problem normalizing input : ' + n_response.error)

print("")
analysis_input = 'Kavanozun kapağını açamadım.'
print('Analysis result for input : ' + fix_decode(analysis_input))
analysis_result = analyze(analysis_input)
for a in analysis_result.results:
best = a.best
lemmas = ""
for l in best.lemmas:
lemmas = lemmas + " " + l
print("Word = " + a.token + ", Lemmas = " + lemmas + ", POS = [" + best.pos + "], Full Analysis = {" + best.analysis + "}")


if __name__ == '__main__':
run()

Kaynaklar

--

--

Burak Tahtacı
Burak Tahtacı

Written by Burak Tahtacı

TA1KNT / Computer Engineer / RC Hobbyist / Data Science and Machine Learning Lover also interested in Information Security

No responses yet