Word 차단기 및 형태소 분석기 구현
Microsoft는 다양한 언어에 대한 단어 분리기 및 형태소 분석기를 제공합니다. 이 항목에서는 Microsoft에서 제공하는 것 이상으로 언어 및 로캘에 사용자 지정 단어 분리기 및 형태소 분석기를 구현하고 사용하는 방법을 설명합니다.
참고
사용자 지정 단어 분리기가 일시적으로 지원되지 않았습니다. 2018년 7월에 Windows Server 2019가 변경되어 Microsoft 서명이 없는 DLL이 SearchIndexer.exe 로드되지 않도록 했습니다. 이 제한은 2021년 1월에 해제되었습니다.
이 항목은 다음과 같이 구성됩니다.
언어 리소스 DLL 등록
각 언어 리소스 DLL은 다음 진입점을 구현하고 내보내야 합니다. 모든 폴더에 DLL을 등록할 수 있습니다.
- DllMain은 DLL의 표준 진입점입니다.
- DllRegisterServer는 레지스트리에 DLL을 등록합니다(예: ).
regsvr32.exe %SystemRoot%\MyFolder\wordbreaker.dll
- DllCanUnloadNow를 사용하면 클라이언트가 COM(구성 요소 개체 모델)을 통해 이 진입점을 호출하여 언어 리소스 DLL을 언로드할 수 있는지 여부를 확인할 수 있습니다.
- DllUnRegisterServer는 레지스트리에서 DLL을 제거합니다.
언어 등록
레지스트리에는 인덱싱되는 언어에 대한 언어별 항목이 포함되며, 이러한 항목은 언어별 인덱싱 및 쿼리 프로세스의 부분을 제어합니다. 이러한 레지스트리 항목은 다음 레지스트리 키에서 찾을 수 있습니다.
HKEY_LOCAL_MACHINE
SYSTEM
CurrentControlSet
ContentIndex
Control
Language
Word 비커 구현
Word 차단기는 IWordBreaker를 구현합니다. IWordBreaker::BreakText 메서드는 모든 텍스트 처리 및 구문 분석을 수행합니다. 단어 분리기 구성 요소를 구현하려면 언어에 대한 언어 추론이 있어야 합니다. 여기에는 구문 및 형태에 대한 정보가 포함됩니다. 제외하거나 포함할 단어 목록이 필요할 수도 있습니다. 제외된 단어 목록에서 언어 로캘의 노이즈 단어 파일을 빌드합니다. 언어 고려 사항 및 이러한 고려 사항이 단어 분리기 구현에 미치는 영향에 대한 자세한 내용은 언어 및 유니코드 고려 사항을 참조하세요.
IWordBreaker::BreakText의 기본 목적은 모든 텍스트가 처리될 때까지 또는 단어 분리기에서 오류가 발생할 때까지 TEXT_SOURCE 텍스트를 지속적으로 처리하는 것입니다. 이 데이터 처리 루프에서 IWordBreaker::BreakText 는 해당 프로세스에 대해 특정 작업을 수행하는 구문 분석 및 유틸리티 메서드를 호출합니다. 예를 들어 독일어 단어 분리기는 복합 단어를 처리할 수 있지만 프랑스어 단어 분리기는 분음 부호 또는 진부함을 처리할 수 있습니다. 단어 분리기가 수행하는 특정 함수와 이러한 작업을 수행하는 데 사용하는 전략은 전적으로 해당 언어의 요구 사항에 따라 달라집니다.
텍스트를 구분할 때 단어 분리기는 여러 표현이 있을 수 있는 단어에 대한 "대체" 양식을 식별합니다. 생성된 단어 사이에 의미 체계 관계가 암시되지 않습니다. 사실, 원래 단어는 대안 목록에 포함되지 않을 수 있습니다. 대체 양식은 원래 단어와 인덱스에서 동일한 위치에 저장되어 동일함을 나타냅니다.
문서가 인덱스에 포함되면 각 단어에 오프셋을 나타내는 정수 값 또는 문서 시작부터의 단어 거리가 할당됩니다. 쿼리의 단어 간 상대적 거리는 전체 텍스트 인덱스에 저장된 오프셋과 비교됩니다. "Where is Kyle's document" 쿼리는 오프셋 n에서 "Where", n+1의 "is", n+2의 "Kyle's" 및 n+3의 "document"를 가진 모든 문서와 일치합니다. "카일의 문서는 데이터 베이스에 어디에 제출되어 있습니까?" 는 다음과 같이 표시됩니다.
Where | 다음인 경우 | 카일 카일의 |
문서 | 출원 | in | the | 데이터베이스 데이터 베이스 |
이 예제에서 단어 분리기는 인덱스에서 "Kyle"("Kyle's") 및 "database"("data base")에 대한 대체 양식을 저장합니다. 단어 분리기는 다음 조건에서 인덱스 생성 프로세스 중에 대체 단어를 생성하고 저장합니다.
- 대체 단어가 쿼리에서 단일 단어로 표시될 가능성이 있는 경우
- 형태소 분석기가 대체 단어에서 원래 단어를 파생시킬 가능성이 없는 경우
대체 단어 양식을 생성하면 다음 변형과 같이 쿼리가 문장을 나타내고 일치하는 방법의 수가 증가합니다.
- 데이터베이스에 제출된 Kyle 문서는 어디에 있습니다.
- 데이터베이스에 제출된 Kyle의 문서는 어디에 있습니다.
- 데이터 베이스에 제출된 Kyle 문서는 어디에 있나요?
- 데이터 베이스에 제출된 Kyle의 문서는 어디에 있나요?
WordSink 및 PhraseSink
Word 차단기는 IWordSink 및 IPhraseSink 개체를 사용하여 텍스트에서 추출한 모든 단어와 구를 수집하고 저장합니다. 단어 분리기는 문서의 원래 단어 양식에 최대한 가까운 형식으로 단어를 저장합니다. IPhraseSink 는 쿼리 시간에 구를 저장합니다. 단어 시퀀스가 길수록 더 드물고 작은 구보다 더 큰 구별을 제공하기 때문에 구는 쿼리 결과의 관련성을 향상시킵니다. 인덱서가 쿼리 시 IPhraseSink에 구를 배치하면 단어 분리기의 instance 만들어 구를 단어로 바꿔줍니다. 그런 다음 인덱서는 구의 단어가 인덱스에서 서로 인접하게 발생하는지 여부를 확인하여 구를 평가합니다. 예를 들어 x, x+1, x+2 및 x+3 위치의 인덱스에서 "ABCD"가 발생하면 "ABCD"의 인접한 부분 문자열이 쿼리에 제출된 경우 구 일치가 발생합니다. 이 전략은 인덱스를 만드는 동안 구와 긴 단어를 분할하고 쿼리 시간 동안 구를 생성하는 문자 기반 단어 분리기에 효과적입니다.
나누기
중단은 단어 사이의 공백입니다. 공백, 문장 부호, 서식 또는 언어 자체의 특성만으로도 중단이 발생할 수 있습니다. 인덱서에서 사용하는 나누기 유형에는 단어 끝(EOW), EOS(문장 끝), EOP(단락 끝) 및 EOC(챕터 끝)의 네 가지 유형이 있습니다. EOW 중단은 기본 중단입니다. 각 토큰 후에 각 중단은 양쪽의 단어 간에 서로 다른 의미 체계 거리를 나타냅니다. EOW로 구분된 단어에는 EOS, EOP 및 EOC 뒤에 가장 엄격한 의미 체계 링크가 있습니다. IWordSink::P utBreak에 대한 여러 호출은 누적되며 null 단어 또는 문장을 삽입하는 것과 유사합니다.
확장성, 성능 및 보안
단어 분리기가 동시 호출에 응답하는 방식은 주로 선택한 스레딩 모델에 따라 결정됩니다. 인덱서는 단일 스레드 애플리케이션입니다. 단어 분리기가 단일 스레드 환경에서 작동하려면 "free" 또는 "both" 스레딩 모델을 사용하여 단어 분리기를 작성해야 합니다. Word 차단기는 "apartment" 스레딩 모델을 사용하여 COM에 등록해서는 안 됩니다.
단어 분리기는 전역 상태를 피하고 단어 분리기에 대한 instance 데이터를 저장하는 것이 좋습니다. 단어 분리기 구현에 저장해야 하는 유일한 콘텐츠는 fQuery 및 ulMaxTokenSize 매개 변수에 대한 것입니다. Word 차단기는 영어 단어 분리기에서 설정한 벤치마크보다 2배 이상 느려야 합니다. Word 차단기 성능도 향상된 하드웨어 기능으로 개선되어야 합니다.
인덱서에 대한 Word 차단기는 로컬 시스템 보안 컨텍스트에서 실행됩니다. 버퍼를 관리하고 올바르게 스택하기 위해 작성해야 합니다. 모든 문자열 복사본에는 버퍼 오버런을 방지하기 위한 명시적 검사가 있어야 합니다. 항상 버퍼의 할당된 크기를 확인하고 버퍼 크기에 대해 데이터 크기를 테스트해야 합니다. Word 차단기는 IWordBreaker::BreakText 메서드에 전달된 텍스트가 잘 형성되었다고 가정할 수 없습니다. 단어 분리기 문제 해결에 대한 자세한 내용은 언어 리소스 문제 해결 및 모범 사례를 참조하세요.
형태소 분석기 구현
형태소 분석기는 IStemmer 인터페이스를 구현합니다. IStemmer::GenerateWordForms 메서드는 특정 입력 단어에 대해 굴절된 단어 양식 목록을 생성합니다. 형태소 분석기 구성 요소를 구현하려면 언어에 대한 언어 추론이 있어야 합니다. 여기에는 형태에 대한 정보가 포함됩니다. 제외하거나 포함할 단어 목록이 필요할 수도 있습니다. 언어 고려 사항 및 이러한 고려 사항이 형태소 분석기 구현에 미치는 영향에 대한 자세한 내용은 언어 및 유니코드 고려 사항을 참조하세요.
형태소 분석기는 단어에 대한 genitive 또는 소유 사례를 생성해서는 안 됩니다. 예를 들어 "David"는 "David's"의 대체 형식으로 생성되지 않습니다. 단어 분리기는 "David's"를 구문 분석할 때 "David"와 "David's"를 모두 생성합니다.
형태소 분석기는 IWordFormSink 개체를 사용하여 대체 단어 목록을 수집합니다. IWordFormSink::P utWord 는 형태소 분석기에서 최종 단어를 생성합니다. 모든 경우에 이 마지막 단어는 IStemmer::GenerateWordForms의 입력 단어와 동일합니다. 예를 들어 "수영"이라는 단어가 지정된 경우 형태소 분석기는 IWordFormSink::P utAltWord를 호출하여 "수영", "수영", "수영", "swum"이라는 단어를 생성합니다. 형태소 분석기는 IWordFormSink::P utWord를 통해 "수영"을 생성합니다.
확장성, 성능 및 보안
단어 분리기와 같은 형태소 분석기는 "무료" 스레딩 모델을 사용하고 스레딩 모델이 "free" 또는 "both"로 설정된 COM에 등록해야 합니다. Windows Search는 서로 다른 스레드에서 형태소 분석기의 별도 인스턴스를 동시에 호출합니다. 따라서 형태소 분석기는 최소 instance 데이터를 가져야 합니다.
형태소 분석기 정확도는 쿼리 관련성에 큰 영향을 미칩니다. 형태소 분석기가 텍스트를 잘못 막는 경우 쿼리는 예측할 수 없고 부정확한 결과를 반환할 수 있습니다. 형태소 분석기는 쿼리 성능에 부정적인 영향을 주지 않고 초당 수백 개의 쿼리를 처리해야 합니다. 형태소 분석기 성능은 향상된 하드웨어 기능으로 개선되어야 합니다. 형태소 분석기 문제 해결에 대한 자세한 내용은 언어 리소스 문제 해결 및 모범 사례를 참조하세요.
Windows Search용 형태소 분석기는 로컬 보안 컨텍스트에서 실행됩니다. 버퍼를 관리하고 올바르게 스택하기 위해 작성해야 합니다. 모든 문자열 복사본에는 버퍼 오버런을 막기 위한 명시적 검사가 있어야 합니다. 항상 버퍼의 할당된 크기를 확인하고 버퍼 크기에 대해 데이터 크기를 테스트해야 합니다.
관련 항목