Padanan Semantik Pengecam Teks Menggunakan Pembenaman LASER dalam Python

Linda Hamilton
Lepaskan: 2024-11-25 05:33:11
asal
628 orang telah melayarinya

Semantic Matching of Text Identifiers Using LASER Embeddings in Python

Apabila menggunakan OCR untuk mendigitalkan laporan kewangan, anda mungkin menghadapi pelbagai pendekatan untuk mengesan kategori tertentu dalam laporan tersebut. Contohnya, kaedah tradisional seperti algoritma Levenshtein boleh digunakan untuk pemadanan rentetan berdasarkan jarak edit, menjadikannya berkesan untuk mengendalikan padanan hampir, seperti membetulkan kesilapan menaip atau variasi kecil dalam teks.

Walau bagaimanapun, cabaran menjadi lebih kompleks apabila anda perlu mengesan berbilang kategori dalam satu baris laporan, terutamanya apabila kategori tersebut mungkin tidak muncul tepat seperti yang dijangkakan atau boleh bertindih secara semantik.

Dalam siaran ini, kami menganalisis pendekatan pemadanan semantik menggunakan pembenaman LASER (Language-Agnostic Sentence Representations) Facebook, menunjukkan cara ia boleh mengendalikan tugas ini dengan berkesan.

Masalah

Objektifnya adalah untuk mengenal pasti istilah kewangan tertentu (kategori) dalam baris teks tertentu. Katakan kita mempunyai set tetap kategori yang dipratentukan yang mewakili semua kemungkinan syarat kepentingan, seperti:

["hasil", "perbelanjaan operasi", "keuntungan operasi", "susut nilai", "faedah", "keuntungan bersih", "cukai", "keuntungan selepas cukai", "metrik 1"]

Diberikan baris input seperti:

"untung operasi, untung bersih dan untung selepas cukai"

Kami menyasarkan untuk mengesan pengecam mana yang muncul dalam baris ini.

Padanan Semantik dengan LASER

Daripada bergantung pada padanan teks tepat atau kabur, kami menggunakan persamaan semantik. Pendekatan ini memanfaatkan pembenaman LASER untuk menangkap makna semantik teks dan membandingkannya menggunakan persamaan kosinus.

Perlaksanaan

Pramemproses Teks

Sebelum membenamkan, teks dipraproses dengan menukarkannya kepada huruf kecil dan mengalih keluar ruang tambahan. Ini memastikan keseragaman.

def preprocess(text):
    return text.lower().strip()
Salin selepas log masuk
Salin selepas log masuk

Membenamkan Pengecam dan Talian Input

Pengekod LASER menjana pembenaman biasa untuk kedua-dua senarai pengecam dan baris input/OCR.

identifier_embeddings = encoder.encode_sentences(identifiers, normalize_embeddings=True)
ocr_line_embedding = encoder.encode_sentences([ocr_line], normalize_embeddings=True)[0]

Salin selepas log masuk
Salin selepas log masuk

Pengecam Kedudukan mengikut Kekhususan

Pengecam yang lebih panjang diutamakan dengan mengisihnya berdasarkan bilangan perkataan. Ini membantu mengendalikan padanan bersarang, di mana pengecam yang lebih panjang mungkin mengambil yang lebih pendek (mis., "keuntungan selepas cukai" menggantikan "keuntungan").

ranked_identifiers = sorted(identifiers, key=lambda x: len(x.split()), reverse=True)
ranked_embeddings = encoder.encode_sentences(ranked_identifiers, normalize_embeddings=True)

Salin selepas log masuk
Salin selepas log masuk

Mengira Persamaan

Menggunakan kesamaan kosinus, kami mengukur kesamaan semantik setiap pengecam dengan baris input. Pengecam dengan persamaan di atas ambang yang ditentukan dianggap padanan.

matches = []
threshold = 0.6

for idx, identifier_embedding in enumerate(ranked_embeddings):
    similarity = cosine_similarity([identifier_embedding], [ocr_line_embedding])[0][0]
    if similarity >= threshold:
        matches.append((ranked_identifiers[idx], similarity))

Salin selepas log masuk

Menyelesaikan Padanan Bersarang

Untuk mengendalikan pengecam yang bertindih, padanan yang lebih panjang diutamakan, memastikan padanan yang lebih pendek di dalamnya dikecualikan.

def preprocess(text):
    return text.lower().strip()
Salin selepas log masuk
Salin selepas log masuk

Keputusan

Apabila kod dilaksanakan, output menyediakan senarai padanan yang dikesan bersama dengan skor persamaannya. Untuk input contoh:

identifier_embeddings = encoder.encode_sentences(identifiers, normalize_embeddings=True)
ocr_line_embedding = encoder.encode_sentences([ocr_line], normalize_embeddings=True)[0]

Salin selepas log masuk
Salin selepas log masuk

Pertimbangan untuk Input Yang Lebih Lama dan Kompleks

Kaedah ini berfungsi dengan baik dalam laporan kewangan berstruktur dengan berbilang kategori pada satu baris, dengan syarat tidak terdapat terlalu banyak kategori atau banyak teks yang tidak berkaitan. Walau bagaimanapun, ketepatan boleh merosot dengan input yang lebih panjang dan kompleks atau teks yang dijana pengguna tidak berstruktur, kerana pembenaman mungkin sukar untuk memfokus pada kategori yang berkaitan. Ia kurang dipercayai untuk input yang bising atau tidak dapat diramalkan.

Kesimpulan

Siaran ini menunjukkan cara pembenaman LASER boleh menjadi alat yang berguna untuk mengesan berbilang kategori dalam teks. Adakah ia pilihan terbaik? Mungkin tidak, tetapi ia sememangnya salah satu pilihan yang patut dipertimbangkan, terutamanya apabila berhadapan dengan senario yang rumit di mana teknik padanan tradisional mungkin gagal.

Kod penuh

ranked_identifiers = sorted(identifiers, key=lambda x: len(x.split()), reverse=True)
ranked_embeddings = encoder.encode_sentences(ranked_identifiers, normalize_embeddings=True)

Salin selepas log masuk
Salin selepas log masuk

Atas ialah kandungan terperinci Padanan Semantik Pengecam Teks Menggunakan Pembenaman LASER dalam Python. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan