2012-03-09 42 views
5

Tôi đang sử dụng NHunspell để kiểm tra một chuỗi lỗi chính tả như sau:Intelligent kiểm tra chính tả

var words = content.Split(' '); 
string[] incorrect; 
using (var spellChecker = new Hunspell(affixFile, dictionaryFile)) 
{ 
    incorrect = words.Where(x => !spellChecker.Spell(x)) 
     .ToArray(); 
} 

thường này hoạt động, nhưng nó có một số vấn đề. Ví dụ, nếu tôi đang kiểm tra câu "Đây là một ví dụ (rất tốt)", nó sẽ báo cáo "(rất" và "tốt)" như bị viết sai chính tả. Hoặc nếu chuỗi chứa thời gian như "8:30", nó sẽ báo cáo đó là một từ sai chính tả. Nó cũng có vấn đề với dấu phẩy, v.v.

Microsoft Word đủ thông minh để nhận dạng danh sách từ, phân tách hoặc phân cách bằng dấu phẩy. Nó biết khi nào không sử dụng một từ điển tiếng Anh, và nó biết khi nào bỏ qua các biểu tượng. Làm thế nào tôi có thể nhận được một kiểm tra chính tả tương tự, thông minh hơn trong phần mềm của tôi? Có thư viện nào cung cấp thông tin tình báo hơn một chút không?

EDIT: Tôi không muốn ép buộc người dùng cài đặt Microsoft Word trên máy của họ, vì vậy việc sử dụng COM interop không phải là một tùy chọn.

Trả lời

6

Nếu trình kiểm tra chính tả của bạn thực sự ngu ngốc, bạn nên mã hóa trước thông tin đầu vào của nó để nhận các từ và nạp chúng vào một lúc (hoặc như một chuỗi được nối với dấu cách). Tôi không quen với C#/NET, nhưng trong Python, bạn muốn sử dụng một RE đơn giản như \w+ cho rằng:.

>>> s = "This is a (very good) example" 
>>> re.findall(r"\w+", s) 
['This', 'is', 'a', 'very', 'good', 'example'] 

và tôi đặt cược NET có một cái gì đó rất giống nhau. Thực tế, theo số .NET docs, \w được hỗ trợ, vì vậy bạn chỉ cần tìm hiểu cách re.findall được gọi ở đó.

0
using System.Text.RegularExpressions; 
... 
// any occurence of (and) (maybe needs escaping) 
string pattern = "((\\.? |)\\.?)"; 
foreach(string i in incorrect){ 
    Regex.Replace(i, pattern, String.Empty) // replace with String.Empty 
} 

Thông tin thêm về regex here. Sau khi tôi đã đọc this Tôi nghĩ Hunspell là một trong những lựa chọn tốt nhất :)

0

trong C#, bạn có thể làm điều gì đó như thế này.

public static class ExtensionHelper 
{ 
    public static string[] GetWords(this string input) 
    { 
     MatchCollection matches = Regex.Matches(input, @"\b[\w']*\b"); 

     var words = from m in matches.Cast<Match>() 
        where !string.IsNullOrEmpty(m.Value) 
        select TrimSuffix(m.Value); 

     return words.ToArray(); 
    } 

    public static string TrimSuffix(this string word) 
    { 
     int apostropheLocation = word.IndexOf('\''); 
     if (apostropheLocation != -1) 
     { 
      word = word.Substring(0, apostropheLocation); 
     } 

     return word; 
    } 
} 

var NumberOfMistakes = content.GetWords() Trường hợp (x => hunspell.Spell (x)!) Đếm()..;

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