Correction d'orthographe et recherche floue: 1 million de fois plus rapidement grâce à une suppression symétrique Algorithme de correction d'orthographe
L'algorithme symétrique de correction d'orthographe de suppression réduit la complexité de la génération des candidats et de la recherche de dictionnaire de modification pour une distance donnée Damerau-Levenshtein. Il s'agit de six ordres de grandeur plus rapidement (que l'approche standard avec les suppressions + transpose + remplace + inserts) et indépendant du langage.
En face des autres algorithmes, seuls les suppressions sont nécessaires, aucune transposition + remplace + inserts. Transpose + Replace + Les inserts du terme d'entrée sont transformés en supprimés du terme de dictionnaire. Les remplacements et les inserts sont coûteux et dépendants du langage: par exemple le chinois a 70 000 caractères Unicode Han!
La vitesse provient de la génération de candidats de modification de suppression de suppression uniquement bon marché et de la pré-calcul .
Un mot moyen de 5 lettres a environ 3 millions d'erreurs d'orthographe possibles dans une distance d'édition maximale de 3,
Mais Symspell doit générer seulement 25 suppressions pour les couvrir toutes, à la fois à la pré-calcul et au temps de recherche. Magie!
Si vous aimez SymSpell, essayez Seekstorm - une bibliothèque de recherche en texte intégral inférieur à Milliseconde et un serveur multi-tenue dans 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
La recherche fournit une correction d'orthographe très rapide des mots simples.
0,033 millisecondes / mot (édition de distance 2) et 0,180 millisecondes / mot (édition de distance 3) (core unique sur MacBook Pro 2012)
1 870 fois plus rapide que BK-are (voir Benchmark 1: Taille du dictionnaire = 500 000, distance d'édition maximale = 3, termes de requête avec distance d'édition aléatoire = 0 ... Distance d'édition maximale, verbose = 0)
1 million de fois plus rapide que l'algorithme de Norvig (voir Benchmark 2: Taille du dictionnaire = 29,157, distance d'édition maximale = 3, termes de requête avec distance d'édition fixe = distance d'édition maximale, verbose = 0)
Algorithme de correction d'orthographe 1000x plus rapide
Correspondance rapide à la chaîne approximative avec les grandes distances de modification dans les mégadonnées
Nettoyage de données très rapide des noms de produits, des noms d'entreprise et des noms de rue
Correction d'orthographe automatique de composé de moins
Symspell vs BK-are: 100x Recherche de chaîne floues plus rapide et vérification des orthographes
Segmentation rapide des mots pour le texte bruyant
Le Trie Radix Trie - un Radix Trie sur les stéroïdes
LookupCompound prend en charge la conscience composée Correction d'orthographe automatique des chaînes d'entrée multi-mots .
1. Françonnage et décomposition composés
Lookup () suppose chaque chaîne d'entrée en tant que terme unique . LookupCompound prend également en charge la fractionnement / décompoudage composé avec trois cas:
Les erreurs de division, les erreurs de concaténation, les erreurs de substitution, les erreurs de transposition, les erreurs de suppression et les erreurs d'insertion peuvent être mélangées dans le même mot.
2. Correction d'orthographe automatique
Exemples:
- 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 millisecondes / mot (édition de distance 2) 5000 mots / seconde (noyau unique sur MacBook Pro 2012)
WordSegmentation divise une chaîne en mots en insérant des espaces manquants à des positions appropriées.
Exemples:
- 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
Applications:
Performance:
4 millisecondes pour segmenter une chaîne de 185 charbon en 53 mots (core unique sur MacBook Pro 2012)
Mot unique + Entrez: Afficher les suggestions d'orthographe
Entrez sans entrée: terminez le programme
Plusieurs mots + entrez: afficher les suggestions d'orthographe
Entrez sans entrée: terminez le programme
chaîne sans espaces + Entrez: afficher le texte segmenté du mot
Entrez sans entrée: terminez le programme
Les projets de démonstration, de démo et de segmentation peuvent être construits avec le code Visual Studio gratuit, qui s'exécute sur Windows, MacOS et 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 cible .NET standard v2.0 et peut être utilisé dans:
Les projets Symspell, Demo, DemoCound et Benchmark peuvent être construits avec le code Visual Studio gratuit, qui s'exécute sur Windows, MacOS et Linux.
La qualité du dictionnaire est primordiale pour la qualité de correction. Afin d'atteindre ces deux sources de données ont été combinées par intersection: Google Books NGRAM Data qui fournit des fréquences de mots représentatives (mais contient de nombreuses entrées avec des erreurs d'orthographe) et des listes de mots orientées par vérificateur orthographique qui assurent un véritable vocabulaire anglais (mais ne contenaient pas de fréquences de mots requis pour le classement des suggestions sur la même distance de modification).
La fréquence_dictionary_en_82_765.txt a été créée en entre-coupe les deux listes mentionnées ci-dessous. En filtrant réciproquement, seuls les mots qui apparaissent dans les deux listes sont utilisés. Des filtres supplémentaires ont été appliqués et la liste résultante a tronqué à ≈ 80 000 mots les plus fréquents.
Vous pouvez créer votre propre dictionnaire de fréquence pour votre langue ou votre domaine technique spécialisé. L'algorithme de correction de l'orthographe Symspell prend en charge les langues avec des caractères non latins, par exemple cyrillique, chinois ou géorgien.
Symspell comprend un dictionnaire de fréquence anglais
Les dictionnaires pour chinois, anglais, français, allemand, hébreu, italien, russe et espagnol sont situés ici:
Symbspell.frequencyDictionary
Des dictionnaires de fréquence dans de nombreuses autres langues peuvent être trouvés ici:
Référentiel de mots fréquentiels
Dictionnaires de fréquence
Dictionnaires de fréquence
C # (code source d'origine)
https://github.com/wolfgarbe/symspell
.NET (package NuGet)
https://www.nuget.org/packages/symspell
Les ports ou réimplémentations tiers suivants à d'autres langages de programmation n'ont pas été testés par moi-même s'ils sont un port exact, sans erreur, fournissent des résultats identiques ou sont aussi rapides que l'algorithme d'origine.
La plupart des ports ciblent Symspell version 3.0 . Mais la version 6.1. Fournit une vitesse de vitesse beaucoup plus élevée et une consommation de mémoire inférieure!
Webassembly
https://github.com/justinwilaby/spellchecker-wasm
API Web (Docker)
https://github.com/leonerath/symspellapi (version 6.3)
C ++
https://github.com/athes21/symspellcpp (version 6.5)
https://github.com/erhanbaris/symspellplusplus (version 6.1)
Cristal
https://github.com/chenkovsky/aha/blob/master/src/aha/sym_spell.cr
Aller
https://github.com/sajari/fuzzy
https://github.com/eskriett/spell
Haskell
https://github.com/cbeav/symspell
Java
https://github.com/mightguy/customated-symspell (version 6.6)
https://github.com/rxp90/jsymspell (version 6.6)
https://github.com/lundez/javasymspell (version 6.4)
https://github.com/rxp90/jsymspell
https://github.com/gpranav88/symspell
https://github.com/searchhub/predict
https://github.com/jpsingarayar/spellblaze
Javascrip
https://github.com/mathieuloutre/node-symspell (version 6.6, a besoin de node.js)
https://github.com/itslenny/symspell.js
https://github.com/dongyuwei/symspell
https://github.com/icecreamyou/symspell
https://github.com/yomagherneal/mnemonist/blob/master/symspell.js
Julia
https://github.com/arkoniak/symspell.jl
Kotlin
https://github.com/wavesonics/symspellkt
Objectif-c
https://github.com/amitbhavsariphone/symspell (version 6.3)
Python
https://github.com/mammothb/symspellpy (version 6.7)
https://github.com/viig99/symspellcpppy (version 6.5)
https://github.com/zoho-labs/symspell (Python Bindings of Rust Version)
https://github.com/ne3x7/pysyspell/ (version 6.1)
https://github.com/ayyuriss/symspell
https://github.com/ppgmg/github_public/blob/master/spell/symspell_python.py
https://github.com/rcorivaud/symspellcompound
https://github.com/esukhia/sympound-python
https://www.kaggle.com/yk1598/symspell-spell-corrector
Rubis
https://github.com/philt/symspell
Rouiller
https://github.com/reneklacan/symspell (version 6.6, compile à webassembly)
https://github.com/luketpeterson/fuzzy_rocks (plan de données persistant soutenu par RocksDB)
Scala
https://github.com/semkath/symspell
Rapide
https://github.com/gdetari/symspellswift
Corcher orthographique multilingue contextuel pour les requêtes utilisateur
Sanat Sharma, Josep Valls-Vargas, Tracy Holloway King, François Guerin, Chirag Arora (Adobe)
https://arxiv.org/abs/2305.01082
Un vérificateur orthographique en temps réel sensible au contexte avec adaptabilité du langage
Prabhakar Gupta (Amazon)
https://arxiv.org/abs/1910.11242
Speakger: un corpus de discours enrichi des métadonnées des états allemands et des parlements fédéraux
Kai-Robin Lange et Carsten Jentsch
https://arxiv.org/pdf/2410.17886
Un vocabulaire de marquage de séquence étendue pour la correction d'erreur grammaticale
Stuart Mesham, Christopher Bryant, Marek Rei, Zheng Yuan
https://arxiv.org/abs/2302.05913
Corpus parlementaire allemand (Gerparcor)
Giuseppe Abrami, Mevlüt Bagci, Leon Hammerla, Alexander Mehler
https://arxiv.org/abs/2204.10422
IOCR: Reconnaissance informée du caractère optique pour les talons de vote électoral
Kenneth U. Oyibo, Jean D. Louis, Juan E. Gilbert
https://arxiv.org/abs/2208.00865
Vérificateur orthographique Amazigh utilisant l'algorithme Damerau-Levenshtein et N-gram
Youness chaabi, fadoua ataa allah
https://www.sciecendirect.com/science/article/pii/S1319157821001828
Enquête sur la correction de la requête pour la récupération des informations sur les entreprises thaïlandaises
Phongsathorn Kittiworapanya, Nuttapong Saelek, Anuruth Lertpiya, Tawunrat Chalothorn
https://ieeexplore.ieee.org/document/9376809
Symspell et LSTM basés sur des vérificateurs pour le tamoul
Selvakumar Murugantamil Arasan Bakthavatchalamtamil Arasan Bakthavatchalammalaikannan Sankarasubbu
https://www.researchgate.net/publication/349924975_symspell_and_lstm_based_spell-_checkers_for_tamil
Symspell4burmese: Algorithme de correction d'orthographe symétrique (Symspell) pour la vérification de l'orthographe birmane
Ei Phyu Phyu Mon; Ye Kyaw Thu; Que yu; Oui wai oo
https://ieeexplore.ieee.org/document/9678171
Vérification orthographique Indonésie Menggunakan Norvig Dan Symspell
Yasir Abdur Rohman
https://medium.com/@yasirabd/spell-check-indonesia-megggunakan-norvig-dan-symspell-4fa583d62c24
Analysis Perbandingan Metode Burkhard Keller Tree Dan Dan Symspell Dalam Correction des sorts Bahasa Indonésie
Muhammad Hafizh Ferdiansyah, I Kadek Dwi Nuryana
https://ejournal.unesa.ac.id/index.php/jinacs/article/download/50989/41739
Amélioration de la récupération de documents avec une correction d'orthographe pour les hadiths translés par indonésie faibles et fabriqués
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_hadithish
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
Réparer les textes fracturés. Une procédure heuristique pour corriger les données OCR
Jens Bjerring-Hansen, Ross Deans Kristensen-McLachla2, Philip Diderichsen et Dorte Haltrup Hansen
https://ceur-ws.org/vol-3232/paper14.pdf
Vers le traitement du langage naturel comme correction d'orthographe pour les systèmes de reconnaissance de texte manuscrits hors ligne
Arthur Flor de Sousa Neto; Byron Leite Dantas Bezerra; et Alejandro Héctor Toselli
https://www.mdpi.com/2076-3417/10/21/7711
Quand utiliser le post-correction OCR pour la reconnaissance des entités nommées?
Vinh-Nam Huynh, Ahmed Hamdi, Antoine Doucet
https://hal.science/hal-03034484v1/
Correction d'erreur automatique: évaluation des performances des outils de vérification orthographique
A. Tolenova
https://journals.sdu.edu.kz/index.php/nts/article/view/690
Zhaw-Cai: Méthode d'ensemble pour la parole allemande suisse au texte allemand standard
Malgorzata Anna Ulasik, Manuela Hurlimann, Bogumila Dubel, Yves Kaufmann,
Silas Rudolf, Jan Deriu, Kataryna Mlynchyk, Hans-Peter Hutter et Mark Cieliebak
https://ceur-ws.org/vol-2957/sg_paper3.pdf
Programme d'erreur de mot cyrillique basé sur l'apprentissage automatique
Battumur, K., Dulamragchaa, U., Enkhbat, S., Altanhuyag, L., et Tuburbaatar, P.
https://mongoliajol.info/index.php/jimdt/article/view/2661
Recherche de chaîne approximative rapide pour la wikification
Szymon Olewniczak, Julian Szymanski
https://www.iccs-meeting.org/archive/iccs2021/papers/127440334.pdf
RumedSpellchecker: Correction des erreurs d'orthographe pour le langage russe naturel dans les dossiers de santé électroniques à l'aide de techniques d'apprentissage automatique
Dmitrii Pogrebnoi, Anastasia Funkner, Sergey Kovalchuk
https://link.springer.com/chapter/10.1007/978-3-031-36024-4_16
Un vocabulaire de marquage de séquence étendue pour la correction d'erreur grammaticale
Stuart Mesham, Christopher Bryant, Marek Rei, Zheng Yuan
https://aclanthology.org/2023.findings-eacl.119.pdf
Recherche de similitude des récepteurs immunitaires adaptatifs à la foudre par recherche de suppression symétrique
Touchchai Chotisorayuth, Andreas Tiffeau-Mayer
https://arxiv.org/html/2403.09010v1
Dévoilage de toxicité déguisée: un nouveau module de prétraitement pour une modération de contenu améliorée
Johnny Chan, Yuming Li
https://www.scieendirect.com/science/article/pii/S2215016124001225
bycycle
-> bicycle
(plutôt que by cycle
)inconvient
-> inconvenient
(au lieu de i convent
)Symspell est apporté par Seekstorm - la recherche haute performance en tant qu'API de service et de recherche