2012-07-06 12 views
9

Estoy buscando una manera relativamente rápida de verificar si las palabras están mal escritas, ya sea usando una gema o API.Método simple de revisión ortográfica/gema en rubí?

He intentado usar varias gemas: raspell, ffi-aspell, hunspell-ffi, spell_cheker y spellchecker, y cada una tiene un error diferente.

Soy bastante nuevo en ruby ​​y espero una solución simple (estoy procesando una gran cantidad de archivos de texto corto y quiero calcular el% de palabras mal escritas) que no incluye la creación de algo desde cero.

Al intentar FFI-aspell, me sale el siguiente error:

/Users/ntaylorthompson/.rvm/gems/ruby-1.9.2-p320/gems/ffi-aspell-0.0.3/lib/ffi/aspell/speller.rb:121: [BUG] Segmentation fault 
ruby 1.9.2p320 (2012-04-20 revision 35421) [x86_64-darwin11.4.0] 

-- control frame ---------- 
c:0005 p:---- s:0019 b:0019 l:000018 d:000018 CFUNC :speller_check 
c:0004 p:0113 s:0013 b:0013 l:000012 d:000012 METHOD /Users/ntaylorthompson/.rvm/gems/ruby-1.9.2-p320/gems/ffi-aspell-0.0.3/lib/ffi/aspell/speller.rb:121 
c:0003 p:0049 s:0007 b:0007 l:0005a8 d:0005d0 EVAL ffi-aspell_test.rb:5 
c:0002 p:---- s:0004 b:0004 l:000003 d:000003 FINISH 
c:0001 p:0000 s:0002 b:0002 l:0005a8 d:0005a8 TOP 
--------------------------- 
-- Ruby level backtrace information ---------------------------------------- 
ffi-aspell_test.rb:5:in `<main>' 
/Users/ntaylorthompson/.rvm/gems/ruby-1.9.2-p320/gems/ffi-aspell-0.0.3/lib/ffi/aspell/speller.rb:121:in `correct?' 
/Users/ntaylorthompson/.rvm/gems/ruby-1.9.2-p320/gems/ffi-aspell-0.0.3/lib/ffi/aspell/speller.rb:121:in `speller_check' 

-- C level backtrace information ------------------------------------------- 

[NOTE] 
You may have encountered a bug in the Ruby interpreter or extension libraries. 
Bug reports are welcome. 
For details: http://www.ruby-lang.org/bugreport.html 

Abort trap: 6 

lo agradecería, ya sea (1) una sugerencia de un enfoque alternativo a los anteriores o (2) una recomendación de cuál utilizar de las 5 gemas anteriores, así que al menos puedo pasar el tiempo depurando la mejor opción.

+1

errores de ¿Qué estás ¿consiguiendo? ¿Tienes aspell instalado para las gemas de aspell? – jmdeldin

+0

Instalé Aspell con Homebrew, y acabo de publicar el error de ffi-aspell anterior, ¿alguna idea? – TaylorT

Respuesta

6

raspell ya no se mantiene, por lo que ffi-aspell es una buena opción si tiene los encabezados de libaspell disponibles.

Si no puede hacer que las bibliotecas funcionen, puede simplemente transferirlas al binario aspell. El siguiente método hará exactamente eso (pruebas unitarias incluidos):

# Returns the percentage of incorrect words per document 
# 
def spellcheck(filename) 
    fail "File #{filename} does not exist" unless File.exists?(filename) 

    words = Float(`wc -w #{filename}`.split.first) 
    wrong = Float(`cat #{filename} | aspell --list | wc -l`.split.first) 

    wrong/words 
end 

if $0 == __FILE__ 
    require 'minitest/autorun' 
    require 'tempfile' 

    describe :spellcheck do 
    def write(str) 
     @file.write str 
     @file.read 
    end 

    before do 
     @file = Tempfile.new('document') 
    end 

    it 'fails when given a bad path' do 
     -> { spellcheck('/tmp/does/not/exist') }.must_raise RuntimeError 
    end 

    it 'returns 0.0 if there are no misspellings' do 
     write 'The quick brown fox' 
     spellcheck(@file.path).must_equal 0.0 
    end 

    it 'returns 0.5 if 2/4 words are misspelled' do 
     write 'jumped over da lacie' 
     spellcheck(@file.path).must_be_close_to 0.5, 1e-8 
    end 

    it 'returns 1.0 if everything is misspelled' do 
     write 'Da quyck bown foxx jmped oer da lassy dogg' 
     spellcheck(@file.path).must_equal 1.0, 1e-8 
    end 

    after do 
     @file.close 
     @file.unlink 
    end 
    end 
end 

spellcheck() asume que tiene cat, wc y aspell en su camino, y que el diccionario por defecto es lo que desea utilizar. La prueba de la unidad es solo para Ruby 1.9. Si está ejecutando 1.8, simplemente bórrelo.

+0

¡Muchas gracias! Pude obtener tanto ffi-aspell como el método anterior para que funcionase. Resulta que preparo aspell instalado sin instalar el diccionario (especificando --lang = en). – TaylorT

0

Como jmdeldin dijo que raspell ya no se mantiene, ffi-aspell es un tenedor.

jugué unos minutos con él y es muy fácil de usar:

  1. instancia un objeto FFI :: :: Aspell ortográfico especificando el idioma
  2. Comprobar si una palabra es correcta utilizando speller.correct?(word)
  3. Obtener una lista de sugerencias para una palabra utilizando speller.suggestions(word)

NOTA: La limitación más grande I' he encontrado hasta ahora que the interface del deletreador funciona solo con palabras. Si desea revisar la ortografía de un documento completo, deberá dividirlo en palabras. Esto no podría ser trivial, especialmente si usted tiene una entrada HTML ...

(depende de aspell, por supuesto, por lo que necesita para instalarlo usando cerveza instalar aspell o su gestor de paquetes preferido)

Cuestiones relacionadas