2012-07-06 17 views
9

Poszukuję stosunkowo szybkiego sposobu sprawdzenia, czy słowa są błędnie napisane przy użyciu klejnotu lub interfejsu API.Prosta metoda sprawdzania pisowni/klejnot w rubinach?

Próbowałem użyć kilku klejnotów - raspell, ffi-aspell, hunspell-ffi, spell_cheker i sprawdzania pisowni - i każdy ma inny błąd.

Jestem całkiem nowy dla ruby ​​i mam nadzieję na proste rozwiązanie (przetwarzam wiele krótkich plików tekstowych i chcę obliczyć% słów źle napisanych), które nie obejmują budowania czegoś od zera.

Gdy próbuje FFI-aspell, pojawia się następujący błąd:

/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 

byłbym wdzięczny albo (1) propozycja alternatywnego podejścia do tych powyżej lub (2) zalecenie do korzystania z których z 5 klejnotów powyżej - dzięki czemu mogę przynajmniej spędzić czas na debugowaniu najlepszej opcji.

+1

Co za błędy jesteś dostawać? Czy masz zainstalowany aspell dla klejnotów aspell? – jmdeldin

+0

Zainstalowałem Aspell z Homebrew, i właśnie wysłałem powyższy błąd ffi-aspell - jakiekolwiek wgląd? – TaylorT

Odpowiedz

6

raspell nie jest już konserwowany, więc ffi-aspell jest dobrym rozwiązaniem, jeśli masz dostępne nagłówki libaspell.

Jeśli nie możesz uruchomić bibliotek, możesz po prostu wytworzyć plik binarny o wartości aspell. Poniższa metoda nie tylko, że (testy jednostkowe w zestawie):

# 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() zakłada masz cat, wc i aspell na swojej drodze, i że słownik domyślna to, co chcesz używać. Test jednostkowy dotyczy tylko Ruby 1.9 - jeśli używasz 1.8, po prostu go skasuj.

+0

Dziękuję bardzo! Udało mi się osiągnąć zarówno ffi-aspell, jak i powyższą metodę. Okazuje się, że naparam zainstalowany aspell bez instalowania słownika (przez podanie --lang = en). – TaylorT

0

Ponieważ jmdeldin powiedział, że raspell nie jest już konserwowany, ffi-aspell jest jego widelcem.

Grałem z nim kilka minut i jest bardzo prosty w obsłudze:

  1. instancję obiektu FFI :: Aspell :: Speller Określanie języka
  2. sprawdzić, czy słowo jest poprawne używając speller.correct?(word)
  3. Pobierz listę sugestii dla słowa używając speller.suggestions(word)

UWAGA: Im większe ograniczenie I do tej pory odkryto, że the interface zaklęcia działa tylko na słowa. Jeśli chcesz sprawdzić pisownię całego dokumentu, musisz podzielić go na słowa. To nie może być trywialne, zwłaszcza jeśli masz wejście HTML ...

(Zależy aspell oczywiście więc trzeba go zainstalować stosując napar zainstalować aspell lub preferowanego menedżera pakietów)

Powiązane problemy