flashtext — Python Paketleri #1

Ahmet Ataşoğlu
2 min readMar 21, 2023

flashtext, metin külliyatlarınızda çok hızlı aramalar ve yerine yazmalar (replace) yapabileceğiniz bir string paketidir. Aho-Corasick algoritmasına benzer bir yaklaşım kullanmaktadır ve arama performansı Regular Expression’a kıyasla aşağıdaki gibidir [1]:

Kurulum

python3 -m pip install git+https://github.com/vi3k6i5/flashtext.git

Bir kaç örnek yapalım:

>>> from flashtext import KeywordProcessor
>>> kp = KeywordProcessor()
>>> kp.add_keyword('İstanbul', 'büyük şehir')
True
>>> kp.add_keyword("Ankara")
True
>>> kp.extract_keywords("İstanbul'un en güzel yanı Ankara'ya dönüşü derler")
['büyük şehir', 'Ankara']
>>> kp.extract_keywords("Yarın İstanbul'da olacağım.")
['büyük şehir']
>>> kp.extract_keywords("İhsan Oktay Anar romanlarında İstanbul")
['büyük şehir']
>>> kp.extract_keywords("İstanbul öyle hemen İstanbul olmadı")
['büyük şehir', 'büyük şehir']
>>> kp.extract_keywords("Bir İstanbullu olarak konuşuyorum.")
[]

Aradığınız anahtar kelimeyi yalın halde (Ankara) bulabildiği gibi, ayrıca isimlendirmenize de olanak tanıyor (büyük şehir). Bu sayede belirli bir kategorideki varlık isimlerini, kategorilerine atıf yaparak listeleyebiliyorsunuz.

Farkettiğiniz gibi son ifadede eşleştirme yapamadı. Bunun nedeni, bir dezavantaj olarak, flashtext’in örüntü tabanlı çalışmaması. Yani aradığı anahtar kelimeyle birebir karşılaşmayı bekliyor. Peki kesme işaretli olanlarda neden sorun çıkmadı? Hemen bakalım:

>>> kp.non_word_boundaries
{'W', 'Y', 'u', 'X', '_', '3', 'x', 'P', 'J', 'a', 'w', 'C', '7', 'I', '8', 'm', 'R', 'O', 'h', 'd', '4', 'K', 'A', 'v', 'L', 'E', 'B', 'i', 's', 'D', 'n', '0', 'M', 'Q', 'e', 'Z', '6', 'F', 'S', 'q', '2', 'c', 'k', '1', 'f', 'z', 'N', 'p', 'V', 'H', 'U', 'l', 'b', 'j', 'y', '9', 'T', 'r', 'G', 'g', '5', 't', 'o'}

Listelenenlerin dışında kalan karakterler, kelimenin sınırları içinde görülmediğinden eşleşmede bir sorun yaratmıyor. Listeyi düzenleyerek, probleminize özgü arama gerçekleştirebilirsiniz.

Yerine yazmayı deneyelim:

>>> kp.add_keyword("Ankara", "başkent")
True
>>> kp.replace_keywords("Ankara gündemi yoğun")
'başkent gündemi yoğun'

Kelimeler üzerinde bulanık (fuzzy) aramalar yapabilmek için:

>>> kp.add_keyword("Ankara", "başkent")
>>> kp.extract_keywords("Ankra bu aralar nasıl", max_cost=1)
['başkent']
>>> kp.add_keyword("selam")
True
>>> kp.extract_keywords("slm ne var ne yok", max_cost=2)
['selam']

max_cost parametresi, kelimelerin arasındaki en fazla Levenshtein uzaklığı olarak kullanılır ve böylece birebir aynı olmayan kelimeler de eşleştirilebilir.

Kaynak

[1] Replace or Retrieve Keywords In Documents at Scale. arXiv 2017

--

--