2012-07-06 36 views
9

Tôi đang tìm một cách tương đối nhanh chóng để kiểm tra xem từ có sai chính tả hay không bằng cách sử dụng đá quý hoặc API.Phương pháp kiểm tra chính tả đơn giản/đá quý trong ruby?

Tôi đã thử sử dụng một số đá quý - raspell, ffi-aspell, hunspell-ffi, spell_cheker và trình kiểm tra chính tả - và mỗi lỗi có lỗi khác nhau.

Tôi khá mới với ruby ​​và hy vọng một giải pháp đơn giản (tôi đang xử lý nhiều tệp văn bản ngắn và muốn tính% từ bị viết sai chính tả) không bao gồm xây dựng thứ gì đó từ đầu.

Khi cố gắng ffi-aspell, tôi nhận được lỗi sau:

/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 

Tôi đánh giá cao hoặc (1) là một gợi ý của một cách tiếp cận thay thế cho những người ở trên hoặc (2) một đề nghị trong đó sử dụng trong số 5 viên đá quý ở trên - vì vậy tôi có thể dành ít thời gian để gỡ lỗi tùy chọn tốt nhất.

+1

Có gì sai sót là bạn nhận được? Bạn có aspell cài đặt cho các đá quý aspell? – jmdeldin

+0

Tôi đã cài đặt Aspell với Homebrew và tôi vừa đăng lỗi ffi-aspell ở trên - bất kỳ thông tin chi tiết nào? – TaylorT

Trả lời

6

raspell không còn được duy trì, vì vậy ffi-aspell là một lựa chọn tốt nếu bạn có tiêu đề libaspell có sẵn.

Nếu bạn không thể làm cho thư viện hoạt động, bạn có thể chỉ cần xuất ra mã nhị phân aspell. Các phương pháp sau đây sẽ làm việc đó (kiểm tra đơn vị bao gồm):

# 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() giả sử bạn có cat, wc, và aspell trên con đường của bạn, và rằng các từ điển mặc định là những gì bạn muốn sử dụng. Bài kiểm tra đơn vị chỉ dành cho Ruby 1.9 - nếu bạn đang chạy 1.8, chỉ cần xóa nó.

+0

Cảm ơn rất nhiều! Tôi đã có thể nhận được cả hai ffi-aspell và phương pháp trên để làm việc. Nó chỉ ra tôi brew cài đặt aspell mà không cần cài đặt từ điển (bằng cách xác định - lang = vi). – TaylorT

0

Như jmdeldin cho biết raspell không còn được duy trì, ffi-aspell là một nhánh của nó.

tôi đã chơi vài phút với nó và nó khá dễ sử dụng:

  1. tạo một đối tượng FFI :: Aspell :: Speller rõ ngôn ngữ
  2. Kiểm tra nếu một từ là đúng bằng speller.correct?(word)
  3. Nhận một danh sách các đề xuất cho một từ bằng speller.suggestions(word)

LƯU ý: hạn chế lớn hơn tôi đã tìm thấy cho đến nay là the interface của người bán lại chỉ hoạt động trên các từ. Nếu bạn muốn đánh vần kiểm tra toàn bộ tài liệu, bạn sẽ cần chia nhỏ tài liệu đó thành các từ. Đây không thể là tầm thường, đặc biệt là nếu bạn có một đầu vào HTML ...

(Nó phụ thuộc vào aspell tất nhiên, do đó bạn cần phải cài đặt nó bằng cách sử brew cài đặt aspell hoặc người quản lý gói ưa thích của bạn)

Các vấn đề liên quan