En estos días estuve estudiando diferentes métodos para crear un SpellChecker(corrector ortográfico).
Cuando empecé a buscar sobre el tema, lo primero que me encontré fue sobre Fuzzy-Matching / Fuzzy-Text, lo que me llevo al algoritmo de Levenshtein.
Con eso ya se podría crear un spellchecker básico, pero tiene un gran problema, no tiene escalabilidad. Si bien podría funcionar correctamente para un diccionario con cientos de palabras, funcionaria fatal al tener miles o decenas de miles de palabras.
Buscando me encontré con muchas soluciones, algunas muy complejas pero con mucha precisión, pero esos métodos suelen consumir mucha memoria RAM al crear muchas Tries/Hashtables. Al final opte por el método mas simple, pre-filtrar las palabras con Soundex / Metaphone.
Funciones:
Código PHP:
// Remueve los acentos y Ñ, pone todo en mayúscula stock word_normalize(const in[], out[], len)
#define PLUGIN "Basic SpellChecker" #define VERSION "1.0" #define AUTHOR "Destro"
new Trie:g_TrieDict
enum _:_EntryStruct { Entry_Original[32], Entry_Normalize[32], // Second Search Entry_Soundex[32], // First Search Entry_Freq // Frequency }
public plugin_init() { // Para encontrar el error de un crash, lo mejor es tener control sobre el inicio y la finalización de las funciones publicas // Una vez que detectas en cual public esta el problema, lo demás es mas fácil debug_hidden("plugin_init() PRE")
register_plugin(PLUGIN, VERSION, AUTHOR)
register_srvcmd("sc", "svcmd_spellcheck")
set_task(2.0, "task_delay")
debug_hidden("plugin_init() POST") }
public plugin_end() { debug_hidden("plugin_end() PRE")
TrieDestroy(g_TrieDict)
debug_hidden("plugin_end() POST")
// Depende del tipo de crash, puede o no llamarse a plugin_end() // Si no se llama, vas a tener que considerar en usar #define DEBUG_ONLY_LOGS // Pero trata de no loggear funciones que se llamen decenas de veces por segundo, sino matas al disco debug_end() }
public task_delay() { debug_hidden("task_delay() PRE")
// Veamos cuanto tiempo tarda en cargar el diccionario... debug_performance_start(hola) load_dictionary() debug_performance_end(hola, "load_dictionary()")
debug_hidden("task_delay() POST") }
load_dictionary() { new entry[_EntryStruct], Array:a, f g_TrieDict = TrieCreate()
f = fopen("es-AR.dic", "r") if(!f) { debug_log1("Error al cargar el diccionario") return }
Esta interesante el aporte, cuando esté en la PC lo voy a ver con más comodidad porque en el celu se deforma todo XD.
Por lo rápido que ví, estaría bueno que le des soporte para amx 1.9 y uses algunas de las funciones nuevas que tiene que están mejor optimizadas. O mejor aún, quizás puedas aportarlo para que sea parte de amx
Believe, be yourself and don't hold on to just one dream ❤
(22/09/2018, 08:34 PM)Federicomb escribió: Esta interesante el aporte, cuando esté en la PC lo voy a ver con más comodidad porque en el celu se deforma todo XD.
Por lo rápido que ví, estaría bueno que le des soporte para amx 1.9 y uses algunas de las funciones nuevas que tiene que están mejor optimizadas. O mejor aún, quizás puedas aportarlo para que sea parte de amx
ya me tendría que estar actualizandome, todavía tengo amxx 1.8.1 y 1.8.2 xd
(22/09/2018, 08:34 PM)Federicomb escribió: Esta interesante el aporte, cuando esté en la PC lo voy a ver con más comodidad porque en el celu se deforma todo XD.
Por lo rápido que ví, estaría bueno que le des soporte para amx 1.9 y uses algunas de las funciones nuevas que tiene que están mejor optimizadas. O mejor aún, quizás puedas aportarlo para que sea parte de amx
ya me tendría que estar actualizandome, todavía tengo amxx 1.8.1 y 1.8.2 xd
23/09/2018, 01:22 AM (Última modificación: 23/09/2018, 01:45 AM por Destro.)
recién me doy cuenta de que esta bug el compiler, convierte mal los caracteres UTF cuando están en un include :S
voy a tener que escribir los bits manualmente, shit
_________
@Edit
Listo, corregido y agregado un plugin de ejemplo
(23/09/2018, 01:22 AM)Destro escribió: recién me doy cuenta de que esta bug el compiler, convierte mal los caracteres UTF cuando están en un include :S
voy a tener que escribir los bits manualmente, shit
_________
@Edit
Listo, corregido y agregado un plugin de ejemplo
(18/11/2014, 05:47 PM)Neeeeeeeeeel.- escribió: Por qué necesitan una guía para todo? Meté mano y que salga lo que salga... es la mejor forma de aprender.
(16/05/2016, 11:08 PM)kikizon2 escribió: No cabe duda que tienen mierda en vez de cerebro, par de pendejos v:
☆Sí necesitas ayuda y tengo tiempo y puedo ayudarte, no dudes en contactarme.
Frase diaria: [ Si el plan falla cambia el plan pero nunca cambies la meta. ]
_______________________________________________________________________________________