Corrección de ortografía y búsqueda difusa: 1 millón de veces más rápido a través del algoritmo de corrección de ortografía de eliminación simétrica
El algoritmo de corrección de ortografía de eliminación simétrica reduce la complejidad de editar generación de candidatos y búsqueda de diccionario para una distancia damerau-levenshtein. Es seis órdenes de magnitud más rápido (que el enfoque estándar con eliminaciones + transposiciones + reemplaza + insertos) y el lenguaje independiente.
Opuesto a otros algoritmos solo se requieren eliminar, no hay transposiciones + reemplaza + insertos. Transpose + reemplazos + insertos del término de entrada se transforman en eliminaciones del término del diccionario. Los reemplazos e insertos son caros y dependen del lenguaje: ¡por ejemplo, chino tiene 70,000 personajes Han unicode!
La velocidad proviene de la generación de candidatos de edición de eliminación solo de eliminación y el pre-calculación .
Una palabra promedio de 5 letras tiene alrededor de 3 millones de errores de ortografía posibles dentro de una distancia de edición máxima de 3,
Pero Symspell necesita generar solo 25 eliminaciones para cubrirlas todas, tanto en precalculación como en el tiempo de búsqueda. ¡Magia!
Si le gusta SymSpell, intente SeekStorm : una biblioteca de búsqueda de texto completo de subconocres y servidor de múltiples tenientes en Rust (código abierto).
Copyright (c) 2022 Wolf Garbe
Version: 6.7.2
Author: Wolf Garbe <[email protected]>
Maintainer: Wolf Garbe <[email protected]>
URL: https://github.com/wolfgarbe/symspell
Description: https://seekstorm.com/blog/1000x-spelling-correction/
MIT License
Copyright (c) 2022 Wolf Garbe
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
documentation files (the "Software"), to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software,
and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
https://opensource.org/licenses/MIT
La búsqueda proporciona una corrección de ortografía muy rápida de palabras individuales.
0.033 milisegundos/palabras (distancia de edición 2) y 0.180 milisegundos/word (distancia de edición 3) (un solo núcleo en 2012 MacBook Pro)
1,870 veces más rápido que el árbol BK (ver referencia 1: tamaño del diccionario = 500,000, distancia de edición máxima = 3, términos de consulta con distancia de edición aleatoria = 0 ... distancia de edición máxima, verbosa = 0)
1 millón de veces más rápido que el algoritmo de Norvig (ver referencia 2: tamaño del diccionario = 29,157, distancia de edición máxima = 3, términos de consulta con distancia de edición fija = distancia de edición máxima, detallado = 0)
1000X Algoritmo de corrección de ortografía más rápido
Coincidencia de cadena aproximada rápida con grandes distancias de edición en big data
Limpieza de datos muy rápida de nombres de productos, nombres de empresas y nombres de calles
Sub-milisegundo compuesto consciente de la corrección de ortografía automática
Symspell vs. BK-Tree: 100x Búsqueda de cadenas difusas más rápidas y verificación de hechizos
Segmentación de palabras rápidas para texto ruidoso
La poda Radix Trie: un Radix Trie sobre esteroides
Busque compuesto admite la corrección de ortografía automática consciente de las cadenas de entrada de múltiples palabras .
1. División y descomposición de compuestos
Lookup () asume cada cadena de entrada como un solo término . BuscarCompuund también admite la división / descomposición de compuestos con tres casos:
Errores de división, errores de concatenación, errores de sustitución, errores de transposición, errores de eliminación y errores de inserción pueden mezclarse dentro de la misma palabra.
2. Corrección de ortografía automática
Ejemplos:
- whereis th elove hehad dated forImuch of thepast who couqdn'tread in sixthgrade and ins pired him
+ where is the love he had dated for much of the past who couldn't read in sixth grade and inspired him (9 edits)
- in te dhird qarter oflast jear he hadlearned ofca sekretplan
+ in the third quarter of last year he had learned of a secret plan (9 edits)
- the bigjest playrs in te strogsommer film slatew ith plety of funn
+ the biggest players in the strong summer film slate with plenty of fun (9 edits)
- Can yu readthis messa ge despite thehorible sppelingmsitakes
+ can you read this message despite the horrible spelling mistakes (9 edits)
0.2 milisegundos / palabras (distancia de edición 2) 5000 palabras / segundo (núcleo único en 2012 MacBook Pro)
WordSegmation divide una cadena en palabras insertando espacios faltantes en posiciones apropiadas.
Ejemplos:
- thequickbrownfoxjumpsoverthelazydog
+ the quick brown fox jumps over the lazy dog
- itwasabrightcolddayinaprilandtheclockswerestrikingthirteen
+ it was a bright cold day in april and the clocks were striking thirteen
- itwasthebestoftimesitwastheworstoftimesitwastheageofwisdomitwastheageoffoolishness
+ it was the best of times it was the worst of times it was the age of wisdom it was the age of foolishness
Aplicaciones:
Actuación:
4 milisegundos para segmentar una cadena de 185 Char en 53 palabras (un solo núcleo en 2012 MacBook Pro)
Palabra única + Enter: Mostrar sugerencias de ortografía
Ingrese sin entrada: finalice el programa
Múltiples palabras + Enter: Mostrar sugerencias de ortografía
Ingrese sin entrada: finalice el programa
Cadena sin espacios + Enter: Mostrar texto segmentado de Word
Ingrese sin entrada: finalice el programa
Los proyectos de demostración, democratamiento y segmentación se pueden construir con el código gratuito de Visual Studio, que se ejecuta en Windows, MacOS y Linux.
//create object
int initialCapacity = 82765 ;
int maxEditDistanceDictionary = 2 ; //maximum edit distance per dictionary precalculation
var symSpell = new SymSpell ( initialCapacity , maxEditDistanceDictionary ) ;
//load dictionary
string baseDirectory = AppDomain . CurrentDomain . BaseDirectory ;
string dictionaryPath = baseDirectory + " ../../../../SymSpell/frequency_dictionary_en_82_765.txt " ;
int termIndex = 0 ; //column of the term in the dictionary text file
int countIndex = 1 ; //column of the term frequency in the dictionary text file
if ( ! symSpell . LoadDictionary ( dictionaryPath , termIndex , countIndex ) )
{
Console . WriteLine ( " File not found! " ) ;
//press any key to exit program
Console . ReadKey ( ) ;
return ;
}
//lookup suggestions for single-word input strings
string inputTerm = " house " ;
int maxEditDistanceLookup = 1 ; //max edit distance per lookup (maxEditDistanceLookup<=maxEditDistanceDictionary)
var suggestionVerbosity = SymSpell . Verbosity . Closest ; //Top, Closest, All
var suggestions = symSpell . Lookup ( inputTerm , suggestionVerbosity , maxEditDistanceLookup ) ;
//display suggestions, edit distance and term frequency
foreach ( var suggestion in suggestions )
{
Console . WriteLine ( suggestion . term + " " + suggestion . distance . ToString ( ) + " " + suggestion . count . ToString ( " N0 " ) ) ;
}
//load bigram dictionary
string dictionaryPath = baseDirectory + " ../../../../SymSpell/frequency_bigramdictionary_en_243_342.txt " ;
int termIndex = 0 ; //column of the term in the dictionary text file
int countIndex = 2 ; //column of the term frequency in the dictionary text file
if ( ! symSpell . LoadBigramDictionary ( dictionaryPath , termIndex , countIndex ) )
{
Console . WriteLine ( " File not found! " ) ;
//press any key to exit program
Console . ReadKey ( ) ;
return ;
}
//lookup suggestions for multi-word input strings (supports compound splitting & merging)
inputTerm = " whereis th elove hehad dated forImuch of thepast who couqdn'tread in sixtgrade and ins pired him " ;
maxEditDistanceLookup = 2 ; //max edit distance per lookup (per single word, not per whole input string)
suggestions = symSpell . LookupCompound ( inputTerm , maxEditDistanceLookup ) ;
//display suggestions, edit distance and term frequency
foreach ( var suggestion in suggestions )
{
Console . WriteLine ( suggestion . term + " " + suggestion . distance . ToString ( ) + " " + suggestion . count . ToString ( " N0 " ) ) ;
}
//word segmentation and correction for multi-word input strings with/without spaces
inputTerm = " thequickbrownfoxjumpsoverthelazydog " ;
maxEditDistance = 0 ;
suggestion = symSpell . WordSegmentation ( input ) ;
//display term and edit distance
Console . WriteLine ( suggestion . correctedString + " " + suggestion . distanceSum . ToString ( " N0 " ) ) ;
//press any key to exit program
Console . ReadKey ( ) ;
SymSpell se dirige a .NET Standard v2.0 y se puede usar en:
Los proyectos de Symspell, Demo, Democompund y Benchmark se pueden construir con el código gratuito de Visual Studio, que se ejecuta en Windows, MacOS y Linux.
La calidad del diccionario es primordial para la calidad de corrección. Para lograr esto, dos fuentes de datos se combinaron por intersección: Google Books Ngram Data que proporcionan frecuencias de palabras representativas (pero contiene muchas entradas con errores de ortografía) y fruncir el ceño: listas de palabras orientadas al corrector orto requerido para la clasificación de sugerencias dentro de la misma distancia de edición).
La frecuencia_dicionary_en_82_765.txt se creó intersectando las dos listas mencionadas a continuación. Al filtrar recíprocamente, solo se utilizan aquellas palabras que aparecen en ambas listas. Se aplicaron filtros adicionales y la lista resultante se truncó a ≈ 80,000 palabras más frecuentes.
Puede construir su propio diccionario de frecuencia para su idioma o su dominio técnico especializado. El algoritmo de corrección de ortografía Symspell admite idiomas con caracteres no latinos, por ejemplo, cirílicos, chinos o georgianos.
Symspell incluye un diccionario de frecuencia en inglés
Los diccionarios para chinos, inglés, francés, alemán, hebreo, italiano, ruso y español se encuentran aquí:
Symspell.FrequencyDictionary
Los diccionarios de frecuencia en muchos otros idiomas se pueden encontrar aquí:
Repositorio de palabras de frecuencia
Diccionarios de frecuencia
Diccionarios de frecuencia
C# (código fuente original)
https://github.com/wolfgarbe/symspell
.NET (paquete nuget)
https://www.nuget.org/packages/symspell
Los siguientes puertos de terceros o reimplementos a otros lenguajes de programación no han sido probados por mí mismo, ya sea un puerto exacto, sin errores, proporcionan resultados idénticos o son tan rápido como el algoritmo original.
La mayoría de los puertos se dirigen a Symspell versión 3.0 . Pero la versión 6.1. ¡Proporciona una velocidad mucho más alta y un menor consumo de memoria!
Aviso web
https://github.com/justinwilaby/spellchecker-wasm
API web (Docker)
https://github.com/leonerath/symspelapi (versión 6.3)
C ++
https://github.com/athes21/symspellcpp (versión 6.5)
https://github.com/erhanbaris/symspellplusplus (versión 6.1)
Cristal
https://github.com/chenkovsky/aha/blob/master/src/aha/sym_spell.cr
Ir
https://github.com/sajari/fuzzy
https://github.com/eskriett/spell
Haskell
https://github.com/cbeav/symspell
Java
https://github.com/mightguy/customized-symspell (versión 6.6)
https://github.com/rxp90/jsymspell (versión 6.6)
https://github.com/lundez/javasymspell (versión 6.4)
https://github.com/rxp90/jsymspell
https://github.com/gpranav88/symspell
https://github.com/searchhub/predict
https://github.com/jpsingaryar/spellblaze
Javascript
https://github.com/mathieuloUtre/node-symspell (versión 6.6, necesita node.js)
https://github.com/itslenny/symspell.js
https://github.com/dongyuwei/symspell
https://github.com/icecreamyou/symspell
https://github.com/yomgu byleal/mnemonist/blob/master/symspell.js
Julia
https://github.com/arkoniak/symspell.jl
Kotlín
https://github.com/wavesonics/symspellkt
Objetivo-C
https://github.com/amitbhavsariphone/symspell (versión 6.3)
Pitón
https://github.com/mammothb/symspellpy (versión 6.7)
https://github.com/viig99/symspellcpppy (versión 6.5)
https://github.com/zoho-labs/symspell (Versión de Python Bindings of Rust)
https://github.com/ne3x7/pysymspell/ (versión 6.1)
https://github.com/ayyuriss/symspell
https://github.com/ppgmg/github_public/blob/master/spell/symspell_python.py
https://github.com/rcourivaud/symspellCompound
https://github.com/esukhia/sympound-python
https://www.kaggle.com/yk1598/symspell-spell-corrector
Rubí
https://github.com/philt/symspell
Óxido
https://github.com/Reneklacan/symspell (versión 6.6, compila a WebAssembly)
https://github.com/luketpeterson/fuzzy_rocks (almacén de datos persistente respaldado por RockSDB)
Escala
https://github.com/semkath/symspell
Rápido
https://github.com/gdetari/symspellswift
Corrector de hechizos multilingüe contextual para consultas de usuarios
Sanat Sharma, Josep Valls-Vargas, Tracy Holloway King, Francois Guerin, Chirag Arora (Adobe)
https://arxiv.org/abs/2305.01082
Un corrector ortográfico en tiempo real sensible al contexto con adaptabilidad del lenguaje
Prabhakar Gupta (Amazon)
https://arxiv.org/abs/1910.11242
Speakger: un corpus de discurso enriquecido de metadatos de parlamentos alemanes estatales y federales
Kai-Robin Lange y Carsten Jentsch
https://arxiv.org/pdf/2410.17886
Un vocabulario de etiquetado de secuencia extendido para la corrección de errores gramaticales
Stuart Mesham, Christopher Bryant, Marek Rei, Zheng Yuan
https://arxiv.org/abs/2302.05913
Corpus parlamentario alemán (Gerparcor)
Giuseppe Abrami, Mevlüt Bagci, Leon Hammerla, Alexander Mehler
https://arxiv.org/abs/2204.10422
IOCR: Reconocimiento de caracteres ópticos informados para la votación electoral
Kenneth U. Oyibo, Jean D. Louis, Juan E. Gilbert
https://arxiv.org/abs/2208.00865
Camplio de ortografía Amazigh usando el algoritmo de Damerau-Levenshtein y N-Gram
Youness Chaabi, Fadoua Ataa Allah
https://www.sciencedirect.com/science/article/pii/s1319157821001828
Encuesta de corrección de consultas para la recuperación de información orientada a los negocios tailandeses
Phongsathorn Kittiworapanya, Nuttapong Saelek, Anuruth Lertpiya, Tawunrat Chalothorn
https://ieeexplore.ieee.org/document/9376809
Corredores de hechizos basados en SymSpell y LSTM para tamil
Selvakumar Murugantamil Arasan Bakthavatchalamtamil Arasan Bakthavatchalammalaikannan Sankarasubbu
https://www.researchgate.net/publication/349924975_symspell_and_lstm_based_spell-_checkers_for_tamil
SymSpell4BurMese: Algoritmo de corrección de ortografía de eliminación simétrica (Symspell) para la comprobación de ortografía birmana
Ei Phyu Phyu Mon; Ye Kyaw Thu; Que yu; Sí wai oo
https://ieeexplore.ieee.org/document/9678171
Correcto de ortografía Indonesia Menggunakan Norvig Dan Symspell
Yasir Abdur Rohman
https://medium.com/@yasirabd/spell-check-indonesia-menggunakan-norvig-dan-symspell-4fa583d62c24
Analisis Perbandingan Metode Burkhard Keller Tree Dan Symspell Dalam Corrección de hechizos Bahasa Indonesia
Muhammad Hafizh Ferdiansyah, I Kadek Dwi Nuryana
https://ejurnal.unesa.ac.id/index.php/jinacs/article/download/50989/41739
Mejora de la recuperación de documentos con corrección de ortografía para hadices de traducción indonesia débil y fabricada
Muhammad Zaky Ramadhankemas m Lhaksmanakemas m Lhaksmana
https://www.researchgate.net/publication/342390145_improving_document_retrieval_with_spelling_correction_for_weak_and_fabricated_indonesian-translated_hadith
Symspell 을 이용한 한글 맞춤법 교정 김희규
https://heegyukim.medium.com/symspell%ec%9d%84-%ec%9d%B4%EC%9A%A9%ED%95%9C-%ED%95%9C%EA%B8%80- %EB%A7%9E%EC%B6%A4%EB%B2%95-%EA%B5%90%EC%A0%95-3DEF9CA00805
Mendigando textos fracturados. Un procedimiento heurístico para corregir los datos de OCR
Jens Bjerring-Hansen, Ross Deans Kristensen-McLachla2, Philip Diderichsen y Dorte Haltrup Hansen
https://ceur-s.org/vol-3232/paper14.pdf
Hacia el procesamiento del lenguaje natural como corrección de ortografía para sistemas de reconocimiento de texto escritos a mano fuera de línea
Arthur Flor de Sousa Neto; Byron Leite Dantas Bezerra; y Alejandro Héctor Toselli
https://www.mdpi.com/2076-3417/10/21/7711
¿Cuándo usar OCR después de la corrección para el reconocimiento de entidades con nombre?
Vinh-Nam Huynh, Ahmed Hamdi, Antoine Doucet
https://hal.science/hal-03034484v1/
Corrección de errores automáticos: evaluar el rendimiento de las herramientas de corrector ortográfico
A. tolenova
https://journals.sdu.edu.kz/index.php/nts/article/view/690
Zhaw-Cai: método de conjunto para el discurso alemán suizo al texto alemán estándar
Malgorzata Anna Ulesik, Manuela Hurlimann, Bogumila Dubel, Yves Kaufmann,
Silas Rudolf, Jan Deriu, Katsiaria Mlynchyk, Hans-Peter Hutter y Mark Cieliebak
https://ceur-s.org/vol-2957/sg_paper3.pdf
Programa de error de palabras cirílicas basado en el aprendizaje automático
Battumur, K., Dulamragchaa, U., Enkhbat, S., Altanhuyag, L. y Tugururbaatar, P.
https://mongoliajol.info/index.php/jimdt/article/view/2661
Búsqueda de cadena aproximada rápida para la wikificación
Szymon Olewniczak, Julian Szymanski
https://www.iccs-meeting.org/archive/iccs2021/papers/127440334.pdf
RumeDspellChecker: corrección de errores de ortografía para el idioma ruso natural en registros de salud electrónicos utilizando técnicas de aprendizaje automático
Dmitrii Pogrebnoi, Anastasia Funkner, Sergey Kovalchuk
https://link.springer.com/chapter/10.1007/978-3-031-36024-4_16
Un vocabulario de etiquetado de secuencia extendido para la corrección de errores gramaticales
Stuart Mesham, Christopher Bryant, Marek Rei, Zheng Yuan
https://aclanthology.org/2023.findings-eacl.119.pdf
Lightning-Fast Adaptive Inmune Receptor Simility Búsqueda por búsqueda de deleción simétrica
Touchchai Chotisorayuth, Andreas Tiffeau-Mayer
https://arxiv.org/html/2403.09010v1
Toxicidad disfrazada de presentación: un nuevo módulo de preprocesamiento para una moderación de contenido mejorada
Johnny Chan, Yuming Li
https://www.sciencedirect.com/science/article/pii/s2215016124001225
bycycle
-> bicycle
(en lugar de by cycle
)inconvient
-> inconvenient
(en lugar de i convent
)Symspell es aportado por Seekstorm : la búsqueda de alto rendimiento como API de servicio y búsqueda