Correção de ortografia e pesquisa difusa: 1 milhão de vezes mais rápido através do algoritmo de correção de ortografia de exclusão simétrica
O algoritmo de correção de ortografia de exclusão simétrica reduz a complexidade da geração de candidatos e a pesquisa de dicionários de edição para uma determinada distância de Damerau-Levenshtein. São seis ordens de magnitude mais rápida (do que a abordagem padrão com exclusão + transpõe + substitui + inserções) e independente da linguagem.
Oposto a outros algoritmos apenas exclui, sem transpostos + substitui + inserções. Transpostos + substitui + inserções do termo de entrada são transformadas em exclusão do termo do dicionário. Substitui e inserções são caras e dependentes da linguagem: por exemplo, os chineses têm 70.000 caracteres unicode Han!
A velocidade vem da geração de candidatos de exclusão de exclusão de exclusão de exclusão barata e do pré-cálculo .
Uma palavra média de 5 letras tem cerca de 3 milhões de possíveis erros de ortografia a uma distância máxima de edição de 3,
Mas o Symsell precisa gerar apenas 25 exclui para cobrir todos eles, tanto no pré-cálculo quanto no momento da pesquisa. Magia!
Se você gosta do SymSPell, tente o SeekStorm -uma biblioteca de pesquisa de texto completo sub-milissegundos e servidor de multi-tenância no Rust (Open Source).
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
A pesquisa fornece uma correção de ortografia muito rápida de palavras únicas.
0,033 milissegundos/palavra (distância de edição 2) e 0,180 milissegundos/palavra (distância de edição 3) (núcleo único no MacBook Pro 2012)
1.870 vezes mais rápido que BK-Tree (ver benchmark 1: Tamanho do dicionário = 500.000, distância máxima de edição = 3, termos de consulta com distância de edição aleatória = 0 ... Distância máxima de edição, detalhe = 0)
1 milhão de vezes mais rápido que o algoritmo de Norvig (ver benchmark 2: tamanho do dicionário = 29.157, distância máxima de edição = 3, termos de consulta com distância de edição fixa = distância máxima de edição, detalhe = 0)
1000X Algoritmo de correção de ortografia mais rápido
Combinação de string rápida aproximada com grandes distâncias de edição em big data
Limpeza de dados muito rápida de nomes de produtos, nomes de empresas e nomes de ruas
Sub-milissegundo composto consciente da correção de ortografia automática
Symsell vs. BK-Tree: 100x mais rápido pesquisa de string e verificação de feitiços
Segmentação rápida de palavras para texto barulhento
O Trie da Radix de poda - um Trie da Radix em esteróides
O LookUpComPound suporta a correção de ortografia automática composta de composição de seqüências de entrada de várias palavras .
1. Divisão de compostos e descompôs
Lookup () assume cada sequência de entrada como termo único . O LookUpComPound também suporta divisão / decomposição de compostos com três casos:
Erros de divisão, erros de concatenação, erros de substituição, erros de transposição, erros de exclusão e erros de inserção podem ser misturados na mesma palavra.
2. Correção de ortografia automática
Exemplos:
- 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 milissegundos / word (Editar Distância 2) 5000 palavras / segundo (núcleo único no MacBook Pro 2012)
O WordSementation divide uma string em palavras inserindo espaços ausentes em posições apropriadas.
Exemplos:
- 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
Aplicações:
Desempenho:
4 milissegundos para segmentar uma string de 185 char em 53 palavras (núcleo único no MacBook Pro 2012)
Palavra única + digite: exibir sugestões de ortografia
Entre sem entrada: encerrar o programa
Múltiplas palavras + digite: exibir sugestões de ortografia
Entre sem entrada: encerrar o programa
String sem espaços + ENTER: Exibir texto segmentado por palavras
Entre sem entrada: encerrar o programa
Os projetos de demonstração, democompom e segmentação podem ser construídos com o código gratuito do Visual Studio, que é executado no Windows, MacOS e 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 metas .NET Standard v2.0 e pode ser usado em:
Os projetos Symspell, Demo, Democompound e Benchmark podem ser criados com o código gratuito do Visual Studio, que é executado no Windows, MacOS e Linux.
A qualidade do dicionário é fundamental para a qualidade da correção. Para alcançar essas duas fontes de dados, foram combinadas pela interseção: os dados do Google Books Ngram, que fornecem frequências representativas de palavras (mas contém muitas entradas com erros de ortografia) e uma careta - listas de palavras orientadas para verificadores de ortografia, que garantem vocabulário inglês genuíno (mas não continha frequências de palavras necessário para a classificação de sugestões dentro da mesma distância de edição).
O frequency_dictionary_en_82_765.txt foi criado cruzando as duas listas mencionadas abaixo. Filtrando reciprocamente apenas as palavras que aparecem nas duas listas são usadas. Filtros adicionais foram aplicados e a lista resultante truncada a ± 80.000 palavras mais frequentes.
Você pode criar seu próprio dicionário de frequência para o seu idioma ou seu domínio técnico especializado. O algoritmo de correção de ortografia do Symsell suporta idiomas com caracteres não latinos, por exemplo, cirílico, chinês ou georgiano.
Symsell inclui um dicionário de frequência em inglês
Dicionários para chinês, inglês, francês, alemão, hebraico, italiano, russo e espanhol estão localizados aqui:
Symspell.FrequencyDictionary
Dicionários de frequência em muitos outros idiomas podem ser encontrados aqui:
Frequencywords repositório
Dicionários de frequência
Dicionários de frequência
C# (código fonte original)
https://github.com/wolfgarbe/symspell
.NET (pacote NUGET)
https://www.nuget.org/packages/symspell
As seguintes portas ou reimplementações de terceiros a outras linguagens de programação não foram testadas por mim mesmo, sejam uma porta exata, sem erros, fornecem resultados idênticos ou são tão rápidos quanto o algoritmo original.
A maioria das portas segmentou o SymSPell versão 3.0 . Mas versão 6.1. Fornece velocidade muito mais alta e menor consumo de memória!
WebAssembly
https://github.com/justinwilaby/spellchecker-wasm
API da Web (Docker)
https://github.com/leonerath/symspellapi (versão 6.3)
C ++
https://github.com/athes21/symspellcpp (versão 6.5)
https://github.com/erhanbaris/symspellplusplus (versão 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 (versão 6.6)
https://github.com/rxp90/jsymspell (versão 6.6)
https://github.com/lundez/javasymspell (versão 6.4)
https://github.com/rxp90/jsymspell
https://github.com/gpranav88/symspell
https://github.com/searchhub/predict
https://github.com/jpsingarayar/spellblaze
JavaScript
https://github.com/mathieuloutre/node-symsell (versão 6.6, precisa de node.js)
https://github.com/itslenny/symspell.js
https://github.com/dongyuwei/symspell
https://github.com/icecreamyou/symspell
https://github.com/yomguithereal/mnemonist/blob/master/symspell.js
Julia
https://github.com/arkoniak/symspell.jl
Kotlin
https://github.com/wavesonics/symspellkt
Objective-C
https://github.com/amitbhavsariphone/symspell (versão 6.3)
Python
https://github.com/mammothb/symspellpy (versão 6.7)
https://github.com/viig99/symspellcpppy (versão 6.5)
https://github.com/zoho-labs/symspell (Python Bindings of Rust Version)
https://github.com/ne3x7/pysymspell/ (versão 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/symspellpell-crector
Rubi
https://github.com/philt/symspell
Ferrugem
https://github.com/reneklacan/symspell (versão 6.6, compila com WebAssembly)
https://github.com/luketpeson/fuzzy_rocks (DataStore persistente apoiado pelo rocksdb)
Scala
https://github.com/semkath/symspell
Swift
https://github.com/gdetari/symspellswift
Verificador ortográfico multilíngue contextual para consultas de usuário
Sanat Sharma, Josep Valls-Vargas, Tracy Holloway King, François Guerin, Chirag Arora (Adobe)
https://arxiv.org/abs/2305.01082
Um verificador ortográfico em tempo real sensível ao contexto com adaptabilidade linguística
Prabhakar Gupta (Amazon)
https://arxiv.org/abs/1910.11242
Speakger: um corpus de fala enriquecido de metadados dos parlamentos estaduais e federais alemães
Kai-Robin Lange e Carsten Jentsch
https://arxiv.org/pdf/2410.17886
Um vocabulário estendido de marcação de sequência para correção de erro gramatical
Stuart Mesham, Christopher Bryant, Marek Rei, Zheng Yuan
https://arxiv.org/abs/2302.05913
Corpus parlamentar alemão (Gerparcor)
Giuseppe Abrami, Mevlüt Bagci, Leon Hammerla, Alexander Mehler
https://arxiv.org/abs/2204.10422
IOCR: Reconhecimento de caracteres ópticos informados para cédulas de eleição
Kenneth U. Oyibo, Jean D. Louis, Juan E. Gilbert
https://arxiv.org/abs/2208.00865
Verificador ortográfico da Amazigh usando o algoritmo Damerau-Levenshtein
Youness Chaabi, Fadoua Ataa Allah
https://www.sciencedirect.com/science/article/pii/s1319157821001828
Pesquisa de correção de consulta para recuperação de informações orientadas para os negócios tailandesa
Phongsathorn Kittiworapanya, Nuttapong Saelek, Anuruth Lertpiya, Tawunrat Chalothorn
https://ieeexplore.ieee.org/document/9376809
Verificadores de feitiços baseados em Symspell e 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 correção de ortografia de exclusão simétrica (Symsell) para verificação de ortografia birmanesa
Ei Phyu Phyu Mon; Ye Kyaw Thu; Do que yu; Sim wai oo
https://ieeexplore.ieee.org/document/9678171
Verificação ortográfica da Indonésia Menggunakan Norvig Dan Symsell
Yasir Abdur Rohman
https://medium.com/@yasirabd/sell-check-indonesia-menggunakan-norvig-dan-symspell-4fa583d62c24
Analisis Perbandingan Metodo Burkhard Keller Tree Dan Symsell Dalam Correção de feitiços Bahasa Indonésia
Muhammad Hafizh Ferdiansyah, I Kadek Dwi Nuryana
https://ejournal.unesa.ac.id/index.php/jinacs/article/download/50989/41739
Melhorando a recuperação de documentos com a correção de ortografia para Hadith, translatado indonésio fraco e fabricado
Muhammad Zaky Ramadhankemas M Lhaksmanakemas M Lhaksmanna
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
Perguardando textos fraturados. Um procedimento heurístico para corrigir dados do OCR
Jens Bjerring-Hansen, Ross Deans Kristensen-McLachla2, Philip Diderichsen e Dorte Haltrup Hansen
https://ceur-ws.org/vol-3232/paper14.pdf
Rumo ao processamento da linguagem natural como correção de ortografia para sistemas de reconhecimento de texto manuscrito offline
Arthur Flor de Sousa Neto; Byron Leite Dantas Bezerra; e Alejandro Héctor Toselli
https://www.mdpi.com/2076-3417/10/21/7711
Quando usar o OCR pós-correção para reconhecimento de entidade nomeado?
Vinh-Nam Huynh, Ahmed Hamdi, Antoine Doucet
https://hal.science/hal-03034484v1/
Correção automática de erros: avaliando o desempenho das ferramentas do verificador ortográfico
A. Tolegenova
https://journals.sdu.edu.kz/index.php/nts/article/view/690
Zhaw-Cai: método de conjunto para discurso alemão suíço para texto alemão padrão
Malgorzata Anna Ulasik, Manuela Hurlimann, Bogumila Dubel, Yves Kaufmann,
Silas Rudolf, Jan Deriu, Katsiarna Mlynchyk, Hans-Peter Hutter e Mark Cieliebak
https://ceur-ws.org/vol-2957/sg_paper3.pdf
Programa de erro de palavra cirílica com base no aprendizado de máquina
Battumur, K., Dulamragchaa, U., Enkhbat, S., Altanhuyag, L., & Tumurbaatar, P.
https://mongoliajol.info/index.php/jimdt/article/view/2661
Pesquisa de string rápida aproximada por Wikification
Szymon Olewniczak, Julian Szymanski
https://www.iccs-meting.org/archive/iccs2021/papers/1274403334.pdf
RUMEDSPELLCHECKER: corrigindo erros de ortografia para a língua russa natural em registros eletrônicos de saúde usando técnicas de aprendizado de máquina
Dmitrii Pogrebnoi, Anastasia Funkner, Sergey Kovalchuk
https://link.springer.com/chapter/10.1007/978-3-031-36024-4_16
Um vocabulário de marcação de sequência estendido para correção de erro gramatical
Stuart Mesham, Christopher Bryant, Marek Rei, Zheng Yuan
https://aclanthology.org/2023.findings-cl.119.pdf
Pesquisa de similaridade de receptores imunológicos adaptativos e rápidos de raios por pesquisa de exclusão simétrica
Touchchai Chotisorayuth, Andreas Tiffeau-Mayer
https://arxiv.org/html/2403.09010v1
Avelando toxicidade disfarçada: um novo módulo de pré-processamento para moderação de conteúdo aprimorada
Johnny Chan, yuming li
https://www.sciencedirect.com/science/article/pii/s2215016124001225
bycycle
-> bicycle
(em vez de by cycle
)inconvient
-> inconvenient
(em vez de i convent
)Symsell é contribuído pela SeekStorm - a pesquisa de alto desempenho como uma API de serviço e pesquisa