Metin Eşleştirme Programı

Arkadaşlar merhaba,

Kendi oluşturduğum bir ürün isimleri ( ANA LİSTE) listem var. Bir de diğer sitelerden taradığım ve tarama sonucu oluşan bir listem ( TARAMA LİSTESİ ) var.
Ana listemdeki her bir ismi, tarama listesinin içerisinde aratarak en yakın eşleşen ile karşılıklı olarak yazdırmak istiyorum.

Bir çok algoritma yazmayı denedim ancak istediğim sonucu alamadım. Algoritmayı çok daha fazla uzatarak doğruya yakın bir sonuç elde etme ihtimalim yüksek ancak çok basit sebepler ile de -şu an ki bilgimle - ne kadar detaylı yazsam da hata alacağıma eminim.

Örneğin en çok doğru sonuca ulaşacağımı düşündüğüm/denediğim yöntem Ana Liste’mdeki ve Tarama Listesi’ndeki her bir ürün adını kelimelere ayırıp, en fazla eşleşmesi olanları karşılıklı yazdırmak oldu. Ancak bunu yaptığımda;

Ana Liste - A = Anker Soundcore Liberty Air 2 Pro Bluetooth Kulaklık
Tarama Listesi - 2 = Anker Soundcore Liberty Air Pro USB-C Charging

ile eşleşiyor. Bununda ana sebebi Tarama Listesi- 1 de bulunan isimde Air 2 Pro kelimesinin Air2Pro şeklinde yazılması. Durum böyle olunca bambaşka bir ürün ile eşleşme oluşuyor.

Denemelerimde çok daha farklı sebepler ile ( Ürün rengi eşleşmesi, kategori ismi eşleşmesi vs. gibi) yanlış sonuçlar aldım.

Daha fazla uzatmadan soruma geçeyim; PYTHON’da bu tarz bir problemi çözmek için bildiğiniz bir modül, önerebileceğiniz bir yöntem var mıdır ? Elbette Google’nin algoritması gibi bir yapay zekaya ihtiyacım yok. Bir çok basit, kompleks sitenin arama barına; sırasız, eksik ürün ismi girdiğimizde bize doğruya yakın bir ürün önerir ya bunun gibi bir yöntem bulabilirsem çok vakit kazanacağım.

Şimdiden vakit ayırdığınız için teşekkür ederim.

Örnek listeler aşağıdadır.

ANA LİSTE
A - Anker Soundcore Liberty Air 2 Pro Bluetooth Kulaklık
B - Anker Soundcore Life Dot 2 Kulaklık
C - Anker Soundcore Life Q10 Bluetooth Kulaklık
D - Audio Technica ATHG1WL Kulaklık
E - Beyerdynamic DT-770PRO 32 Ohm Kulaklık
F - Beyerdynamic DT-880Pro Kulaklık

TARAMA LİSTESİ
1 - Anker Soundcore Liberty Air2Pro True Wireless Earbuds
2 - Anker Soundcore Liberty Air Pro USB-C Charging, Deep Bass, Aux Input (Blue)
3 - Soundcore Anker Life Q10 Wireless Bluetooth Headphones 60-Hour Playtime and Fast
4 - Audio-Technica ATH-G1WL Premium Wireless Over Ear Gaming Headset
5 - beyerdynamic DT 770 PRO 32 Ohm Over-Ear Studio Headphones in Black
6 - beyerdynamic DT 880 Pro Over-Ear Studio Headphone
7 - Anker Soundcore Life Dot 2 True Wireless Earbuds

Tarama listeniz ve kendi ürün listeniz farklı dillerde olduğu için benzerlik algoritmaları doğru çalışmayabilir. Mesela siz de ürün listenizi ingilizce yaparsanız, dahili difflib modülü ile şöyle bir sonuç alabilirsiniz. Boşlukları kaldırıp bu benzerlik oranlarını (veya noktalama işaretlerini, büyük küçük harf durumunu vs) yükseltebilirsiniz. Önce normal test edelim.

>>> import difflib
>>> a = "Beyerdynamic DT-770PRO 32 Ohm Kulaklık"
>>> b = "beyerdynamic DT 770 PRO 32 Ohm Over-Ear Studio Headphones in Black"
>>> difflib.SequenceMatcher(None, a.replace(" ",""), b.replace(" ","")).ratio()*100
62.22222222222222

Ürünü ingilizce yazarsak

>>> a = "Beyerdynamic DT-770PRO 32 Ohm Headphones"
>>> b = "beyerdynamic DT 770 PRO 32 Ohm Over-Ear Studio Headphones in Black"
>>> difflib.SequenceMatcher(None, a.replace(" ",""), b.replace(" ","")).ratio()*100
73.91304347826086

En basit halini düşünerek yazdım. Biraz araştırdığımda işin içine derin öğrenme modeli katıp benzerlik ölçenleri de gördüm.

3 Beğeni

Bu fikirler size saçma geliyor ise lütfen mazur görünüz.

Hocam sen bunu deyince benim aklıma da acaba bu iş genetik algoritma kullanılarak yapılabilir mi sorusu geldi :slight_smile: Daha önce genetik algoritma ile uğraşmadım ama uğraşmak nasip olur inşallah (şansımı bir deneyim bu problem üzerinde, bakalım olacak mı?)

İkinci olarak aklıma levenshtein algoritması geldi ama bu algoritma ile matrix oluşturduğumuz için string boyutu fazla olursa problem baş gösterir.

Tabi benim tavsiyeler fuzuli tavsiyeler serisi, bence en iyisini @coderistan hocamız yazmış zaten.

1 Beğeni

Hocam çok teşekkür ederim. Dediğiniz gibi programa aktarım sırasında noktalamaları kaldırıp, tüm harfleri küçültürsem ve basit bir çeviri ile İngilizce metinleri Türkçeleştirirsem ( bazen Türkçe karşılaştırma yapmam da gerekebiliyor ) eşleşme oranını daha da yükseltebilirim gibi geldi. Bu modülü bilmiyordum, işime yarayacağa benziyor.

Tekrar teşekkürler

1 Beğeni

Evet levenshtein distance algoritması benim de aklıma geldi ama onun için modül yüklemesi gerekiyor vs en iyisi dahili modül kullanmak. Genetik algoritmalara gelince, belki şuradaki makaleyi okumak isteyebilirsiniz. Konu ile direkt bağlantısı olmasa da ilginizi çekebilir.

https://www.researchgate.net/publication/223603619_Genetic_algorithm_for_text_clustering_using_ontology_and_evaluating_the_validity_of_various_semantic_similarity_measures

1 Beğeni

Fuzzywuzzy kütüphanesi işinizi görebilir.

1 Beğeni