2010-08-10 3 views
6

놀랍게도 나는 정말로이 일을하는 다른 사람을 찾을 수 없었지만, 분명히 누군가 가지고 있습니다. 현재 약 16,000 단어의 철자 검사와 관련된 파이썬 프로젝트를 진행 중입니다. 그 수의 단어는 불행하게도 커질 것입니다. 지금 나는 몽고에서 단어를 가져 와서 반복하고, 펜치로 그들을 확인하는 철자가있다. 나는 모든 항목을 먼저 잡아 잠재적 인 병목 현상으로 몽고를 제거했습니다. 16K 단어를 처리하는 데 약 20 분이 걸리고, 내가 쓰고 싶은 것보다 오래 걸립니다. 이것은 몇 가지 아이디어/질문으로 나를 남겨 둡니다 :Python의 "Large"scale 맞춤법 검사

  1. 분명히 스레딩이나 어떤 형태의 병렬 처리를 활용할 수 있습니다. 내가 이것을 4 조각으로자를지라도, 나는 여전히 최고 성능을 가정하고 대략 5 분을보고있다.

  2. 인챈트가 파이 렌트 아래에서 사용하고있는 맞춤법 라이브러리를 알 수있는 방법이 있습니까? Enchant의 웹 사이트는 맞춤법 검사시 사용 가능한 모든 철자 라이브러리/사전을 사용한다는 것을 암시하는 것으로 보입니다. 그렇다면 3 가지 철자법 사전을 통해 각 단어를 실행할 가능성이 있습니다. 이것은 바로 여기 내 문제 일 수 있지만, 나는 그것이 사실임을 증명하는 데 어려움을 겪고있다. 그렇다면 다른 라이브러리를 정말로 제거 할 수 있습니까? 불행한 소리.

그럼, 어떻게 생각해 볼 수 있겠습니까? 이 작업을 병렬 작업으로 잘게도 괜찮지 만, 그 전에 핵심 부분을 조금 더 빨리 처리하고 싶습니다.

편집 : 죄송합니다, 모닝 커피 전에 게시 ... 마법 철자가 철자가 틀린 경우 제안 사항 목록을 생성합니다. 그것은 내가이 처리 부분에서 대부분의 시간을 보내는 곳인 것처럼 보일 것입니다.

+2

20 분 16 천 단어에 대한 것은 굉장히 긴 시간처럼 들린다. 파이썬 사전에 단어를로드하고 각각에 대한 검색을 수행 할 수 있습니까? 그것은 확실히 20 분 미만 걸릴 것입니다. (아마도 20 분 내에 쓸 수 있습니다.) – ggg

+1

Enchant의 모든 권한을 사용하고 있습니까? 아니면 단어의 철자가 올바른지 (즉, 사전에 알려진 사전)를 확인하고 있습니까? 후자의 경우 ggg가 말한 것을 수행하고 맞춤법 검사기를 만드십시오. – katrielalex

+2

병렬 처리를 고려하지 마십시오. 나는 입력 한 것을 누르는 것보다 적은 시간에 60k 사전에 대해 100k 단어를 검사했다. 더 나은 알고리즘이 필요합니다. – msw

답변

5

성능 병목 현상이 여기 엔 인챈트라고 생각합니다. 이 데이터 세트의 크기는 부울 값 isSpeltCorrectly을 거의 즉각적으로 처리합니다. 그럼, 왜 안 :

  1. 는 인챈트가하는 사전을 사용하거나 자신의 (예를 들어, OpenOffice's) 가져 오는 올바르게 철자 단어의 메모리에 세트를 구축 할 수 있습니다.

    선택적으로 문서의 단어를 고유화 (예 : set)하십시오. 이것은 아마도 당신을 많이 구해 내지 못할 것입니다.

  2. 각 단어가 세트에 있는지 확인하십시오. 이것은 단지 세트 룩업이기 때문에 빠르다. (아마 O(log N) N은 파이썬 전문가 날 여기를 보정 할 수 있습니다 ... 해시에 의해 set 버킷 가정? 단어의 수와 이진 검색을 수행 곳.)

  3. 그렇지 않은 경우 에 마법 부여 요청 그것을위한 한 마디를 추천하십시오. 이것은 반드시 느립니다.

여기에는 대부분의 단어의 철자가 올바른 것으로 가정합니다. 그렇지 않은 경우, 당신은 더 똑똑해야합니다.

+0

최대 6 분이 소요됩니다. 그것은 아직도 길지만 더 좋습니다. 웹 크롤링시 잘못된 철자가 많이 발견 될 수도 있습니다. – f4nt

+0

캐치를 처리하기 위해 인챈트에 대한 인터페이스로 실행되는 별도의 프로세스를 사용하는 경우에도 인챈트 조회를 병렬 처리 할 수 ​​있습니다. – katrielalex

+0

@ f4nt이 문제도 발생합니다. 사전 단어의 근원으로 무엇을 사용 했습니까? 솔루션에 대해 공유 할 수있는 다른 세부 사항은 무엇입니까? – tw1742

1

문서를 압축하는 것이 더 좋은 방법 일 수 있습니다. 반복되는 단어의 인스턴스가 제거되므로 실제로 한 번만 맞춤법 검사를 수행하면됩니다. 필자 만의 독특한 단어 찾기를 작성하는 것보다 더 빨리 수행 할 수 있으므로이 방법을 권장합니다.

압축 된 버전은 고유 한 단어에 대한 참조가 있어야하며 파일 내에서 어딘가에 구성되어 있는지 확인해야 할 수 있습니다.

그런 다음 모든 고유 단어의 맞춤법을 검사 할 수 있습니다. 나는 당신이 개별적인 SQL 질의들 또는 그것들로 그것들을 검사하지 않기를 바란다. 당신은 나무의 형태로 사전을 당신의 기억에로드해야하고 그것에 대해 단어들을 검사해야한다.

일단 완료되면 간단히 압축을 풀어 안녕하세요, 사전에의 맞춤법을 검사했습니다. 이것은 상당히 빠른 솔루션이어야합니다.

또는 맞춤법 검사가 주석의 제안과 같이 빠르면 잘못된 전체 처리를 나타낼 수도 있습니다.

+0

음, 이해할 수 있을지 모르겠다. 문서를 압축하고 이진 zip 파일을 구문 분석한다는 의미입니까? 그게 효과가 있다고 확신합니까? – katrielalex

+0

이 작업을 수행하는 유일한 합리적인 방법은 어휘가 전체 단어 인 하프 맨즈 나무를 만드는 것입니다. 이것은 계산 상 katrielalex의 답과 같습니다. 하위 단어 수준에서 작동하는 다른 압축은 미묘하게 복잡하지만 유틸리티를 추가하지는 않습니다. – msw

2

Peter Norvig 스타일 맞춤법 검사기를 사용합니다. 나는 이것에 대한 완전한 글을 썼다.

http://blog.mattalcock.com/2012/12/5/python-spell-checker/

여기에 확인하는 단어의 수 편집에 보이는 코드의 조각입니다.

def edits1(word): 
    s = [(word[:i], word[i:]) for i in range(len(word) + 1)] 
    deletes = [a + b[1:] for a, b in s if b] 
    transposes = [a + b[1] + b[0] + b[2:] for a, b in s if len(b)>1] 
    replaces = [a + c + b[1:] for a, b in s for c in alphabet if b] 
    inserts = [a + c + b  for a, b in s for c in alphabet] 
    return set(deletes + transposes + replaces + inserts) 

성장하는 데이터 파일을 반복하여 확인해야이 코드를 검사하여 매우 빠르게 확인할 수 있습니다. 자세한 내용은 전체 게시물을 참조 :

http://blog.mattalcock.com/2012/12/5/python-spell-checker/