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.
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.
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.
Sebelum membenamkan, teks dipraproses dengan menukarkannya kepada huruf kecil dan mengalih keluar ruang tambahan. Ini memastikan keseragaman.
def preprocess(text): return text.lower().strip()
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]
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)
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))
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()
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]
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.
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.
ranked_identifiers = sorted(identifiers, key=lambda x: len(x.split()), reverse=True) ranked_embeddings = encoder.encode_sentences(ranked_identifiers, normalize_embeddings=True)
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!