Kesamaan antara dua kata

15

Saya mencari perpustakaan Python yang membantu saya mengidentifikasi kesamaan antara dua kata atau kalimat.

Saya akan melakukan konversi Audio ke Teks yang akan menghasilkan kamus bahasa Inggris atau kata-kata non-kamus (Ini bisa berupa Orang atau nama Perusahaan) Setelah itu, saya perlu membandingkannya dengan kata atau kata-kata yang dikenal.

Contoh:

1) Hasil teks ke audio: Terima kasih telah menelepon America Expansion akan dibandingkan dengan American Express .

Kedua kalimat itu entah bagaimana serupa tetapi tidak sama.

Sepertinya saya mungkin perlu melihat ke berapa banyak karakter yang mereka bagikan. Ide apa pun akan bagus. Tampak fungsionalitas seperti pencarian Google "maksud Anda" fitur.

gogasca
sumber

Jawaban:

14

Yang terdekat adalah seperti yang disebutkan Jan dalam jawaban ini, jarak Levenstein (juga populer disebut jarak edit).

Dalam teori informasi dan ilmu komputer, jarak Levenshtein adalah metrik string untuk mengukur perbedaan antara dua urutan. Secara informal, jarak Levenshtein antara dua kata adalah jumlah minimum pengeditan karakter tunggal (yaitu penyisipan, penghapusan atau pergantian) yang diperlukan untuk mengubah satu kata menjadi yang lain.

Ini adalah metrik yang sangat umum digunakan untuk mengidentifikasi kata-kata serupa. Nltk sudah memiliki implementasi untuk metrik jarak edit, yang dapat dipanggil dengan cara berikut:

import nltk
nltk.edit_distance("humpty", "dumpty")

Kode di atas akan kembali 1, karena hanya satu huruf yang berbeda antara dua kata.

Dawny33
sumber
1
Jarak Lavenshtien adalah algoritma terburuk yang dapat Anda gunakan jika NLP adalah apa yang ingin Anda lakukan. Jika 2 sinonim memiliki rangkaian karakter yang berbeda, LD akan berkinerja sangat buruk dalam kasus tersebut.
Ini jebakan
8

Terlepas dari respons yang sangat baik di sini, Anda dapat mencoba SequenceMatcher di pustaka python difflib.

https://docs.python.org/2/library/difflib.html

import difflib

a = 'Thanks for calling America Expansion'
b = 'Thanks for calling American Express'

seq = difflib.SequenceMatcher(None,a,b)
d = seq.ratio()*100
print(d) 
### OUTPUT: 87.323943

Sekarang Pertimbangkan kode di bawah ini:

a = 'Thanks for calling American Expansion'
b = 'Thanks for calling American Express'

seq = difflib.SequenceMatcher(None,a,b)
d = seq.ratio()*100
print(d)
### OUTPUT: 88.88888

Sekarang Anda dapat membandingkan nilai d untuk mengevaluasi kesamaan.

SVK
sumber
1
Jika Anda merasa bahwa seq.ratio () lambat, Anda dapat menggunakan seq.quick_ratio ()
Nabin
6

Jika kamus Anda tidak terlalu besar, pendekatan umum adalah mengambil jarak Levenshtein, yang pada dasarnya menghitung berapa banyak perubahan yang harus Anda lakukan untuk berpindah dari satu kata ke kata lain. Perubahan termasuk mengubah karakter, menghapus karakter atau menambahkan karakter. Contoh dari Wikipedia :

lev (anak kucing, duduk) = 3

  • k itten -> s itten
  • sitt e n -> sitt i n
  • sittin -> sittin g

Berikut adalah beberapa implementasi Python di Wikibooks.

Algoritma untuk menghitung jarak ini tidaklah murah. Jika Anda perlu melakukan ini dalam skala besar, ada cara untuk menggunakan kesamaan cosinus pada vektor bi-gram yang jauh lebih cepat dan mudah didistribusikan jika Anda perlu menemukan kecocokan untuk banyak kata sekaligus. Namun mereka hanya perkiraan untuk jarak ini.

Jan van der Vegt
sumber
(+1) untuk Lev. metrik jarak. nltk hadir dengan implementasi yang sudah jadi. Kesamaan cosine bukan ukuran string-kesamaan yang baik IMHO :)
Dawny33
Saya setuju bahwa ini jauh lebih buruk daripada jarak Levenshtein tetapi jika Anda memerlukan pencocokan fuzzy antara 2 dataset jutaan itu sebenarnya dapat melakukan itu dalam waktu yang wajar karena memerlukan beberapa trik ditambah perkalian matriks
Jan van der Vegt
1
@ Dawny33 Saya tidak setuju. Tidak hanya kesamaan cosinus bekerja sangat cepat untuk saya tetapi juga sangat akurat mengingat bahwa n-gram yang tepat digunakan.
Mohit Motwani
3

Teknik perbandingan yang lama dan terkenal adalah algoritma Soundex . Idenya adalah untuk membandingkan bukan kata-kata itu sendiri tetapi perkiraan bagaimana mereka diucapkan. Sejauh mana ini benar-benar meningkatkan kualitas hasil yang saya tidak tahu.

Namun rasanya agak aneh untuk menerapkan sesuatu seperti Soundex ke hasil dari mesin pengenalan suara-ke-teks. Pertama Anda membuang informasi tentang bagaimana kata-kata diucapkan, kemudian Anda mencoba menambahkannya kembali. Akan lebih baik untuk menggabungkan dua fase ini.

Oleh karena itu, saya berharap keadaan teknologi seni di bidang ini untuk melakukan itu, dan menjadi semacam klasifikasi adaptif, misalnya berdasarkan jaringan saraf. Google mengembalikan riset terbaru tentang Pengenalan Suara dengan Neural Networks .

reinierpost
sumber