2013-07-31 2 views
2

필자는 맞춤법 검사를 허용하지 않는 매우 오래된 데이터베이스 GUI를 사용하여 엄청난 양의 데이터를 손으로 입력하는 도구를 연구 중이므로 후 처리 과정에서이 작업을 수행해야합니다. 이것은 C#의 첫 번째 진지한 프로그램이며 사전처럼 더 복잡한 내용을 구현하거나 NHunspell과 같은 외부 라이브러리를 사용하기 전에 문자열에 오류가 있는지 여부를 확인하기 위해 일반 문자열에 적용 할 수있는 기본 메서드가 있는지 궁금합니다.데이터 유형 문자열에 대한 기본 맞춤법 검사 방법이 있습니까?

SpellCheck 클래스에 대해 읽었지만 텍스트 상자를 사용하지 않는 간단한 문자열을 통해 어떻게 사용할 수 있는지 알지 못합니다. 가능한 경우 누군가 제발 어떻게 할 수 있는지 보여 줄 수 있습니까?

미리 감사드립니다.

+5

맞춤법 검사 기능이 내장 된 문자열 유형을 사용하기 전에 어떤 언어를 사용했는지 궁금합니다. – GolezTrol

+0

안녕하세요, 프로그래밍에 대한 배경 지식이 많지 않습니다. 초보자지만 처음 사용하게되었습니다. OO 언어와 나는 너무 행복해서 거의 모든 것에 대한 기존의 메소드가 있다는 것에 놀라움을 금치 못했습니다. 그래서 내가이 메소드에 대한 고유 메소드를 찾지 못해 놀랐다. – lostborion

+0

http://stackoverflow.com/a/15293895/4068 –

답변

4

나는 최근에 내가 (당신은 또한 NuGet에서 얻을 수있는) NHunspell을 사용했습니다 비슷한에 근무했습니다, 그래서 그것을 정확한 코드가 아니지만, 꽤 근처입니다 (같은 것을 가지고) :

public IDictionary<string, IEnumerable<string>> Analyze(string text) 
{ 
    var results = new Dictionary<string, IEnumerable<string>>(); 

    using (var hunspell = new Hunspell("Resources\\en_GB.aff", "Resources\\en_GB.dic")) 
    { 
     string[] words = Regex.Split(text, @"\W+", RegexOptions.IgnoreCase); 
     IEnumerable<string> misspelledWords = words.Where(word => !hunspell.Spell(word)); 

     foreach (string word in misspelledWords) 
     { 
      IEnumerable<string> suggestions = hunspell.Suggest(word); 
      results.Add(word, suggestions); 
     } 
    } 
    return results; 
} 

텍스트를 분석하고 철자가 잘못된 단어 사전을 각 단어에 대한 제안 목록과 함께 반환합니다.

그냥 추가하면 here은 (다른 언어로 된) Hunspell 사전 목록입니다.

+1

고마워,이게 내 요구에 가장 잘 맞는 옵션이라고 생각해. – lostborion

+0

@lostborion 기꺼이 도와 드릴 수 있습니다 :) –

3

맞춤법 검사를 구현하는 가장 쉬운 방법은 웹 API를 사용하는 것입니다. 다행히도 Microsoft는 이미 하나를 만들었습니다 http://msdn.microsoft.com/en-us/library/windows/desktop/hh869852(v=vs.85).aspx

두 번째 방법은 사전을 다운로드하고 가능한 단어마다 반복 한 다음 The Levenshtein distance calculation을 사용하여 유사도 백분율을 반환합니다. 단어가 75 % 이상인 경우 수정이라고 제안 할 수 있습니다. 여기

가 Levenshtein 거리 계산에 또 다른 링크입니다, 이것은 좋은 C# 예제 http://www.dotnetperls.com/levenshtein

이의 길이로 거리 계산

  1. 설정 n의 기본 아이디어를 가지고 에스. ("GUMBO") m을 t의 길이로 설정하십시오. ("GAMBOL")

    n = 0이면 m을 입력하고 종료하십시오.

    m = 0이면 n을 반환하고 종료하십시오.

    0..m 요소를 포함하는 두 벡터, v0 [m + 1] 및 v1 [m + 1]을 만듭니다.

  2. v0을 0..0으로 초기화합니다.

  3. s (i는 1에서 n까지)의 각 문자를 검사하십시오.

  4. t (j는 1에서 m까지)의 각 문자를 검사하십시오. S가 [I] [J는 비용 1.

  5. 집합 전지 V1은 [J] T와 동일하지 않은 경우

  6. S [I]를 t [J]를 동일한 경우, 비용은 0이다 ] 최소값 :

    a. 플러스 1 바로 위의 셀 : v1 [j-1] + 1

    b. 바로 왼쪽의 셀 +1 : v0 [j] + 1

    c. 대각선으로 위와 왼쪽에있는 셀에 비용 : v0 [j-1] + 비용.

  7. 반복 단계 (3, 4, 5, 6)가 완료된 후, 거리는 셀 v1 [m]에서 발견됩니다.

+0

웹 API? 분명히 '거대한 양의 데이터'에 대해서는 나쁜 생각일까요? – Joe

+0

@Joe 아마도 두 가지 옵션 중 더 적은 것이 동의합니다. 가장 좋은 방법은 거리 계산입니다. 가장 쉬운 방법은 훨씬 웹 API입니다. –

+0

물론 가장 좋지는 않지만 대용량 데이터에 대한 질문에는 권장하지 않습니다. – Joe