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