2008-10-12 4 views

답변

5

이상적으로 유틸리티를 사용할 수있는 유틸리티가 있지만 이상하지는 않습니다. 그러나 합리적으로 효율적인 방법으로 이것을 "손으로"하는 것은 그리 어렵지 않습니다. 관심있는 하위 집합을 정의하는 데 사용할 수있는 Query 및/또는 개체가 이미 있다고 가정합니다.

먼저 색인 하위 집합에있는 모든 문서 ID의 목록을 작성하십시오. IndexSearcher.search(Query, Filter, HitCollector)을 사용하면이 작업을 매우 빠르게 수행 할 수 있습니다. HitCollectordocumentation에는 작동해야하는 것처럼 보이는 예제가 포함되어 있거나 다른 컨테이너를 사용하여 문서 ID를 저장할 수 있습니다.

다음으로 빈 HashMap (또는 무엇이든)을 초기화하여 용어를 전체 빈도로 매핑하고 모든 문서 및 관심 분야에 대해 IndexReader.getTermFreqVector 방법 중 하나를 호출하여지도를 채 웁니다. 세 가지 인수 형식이 더 단순 해 보이지만 어느 것이 든 괜찮습니다. 3 가지 형식의 양식의 경우 이 frequency 인 경우지도에 포함되어 있는지 map 방법이 확인한 TermVectorMapper을 만들거나 그렇지 않은 경우 frequency을 추가합니다. 이 패스에서 에 대한 모든 호출에서 동일한 TermVectorMapper 객체를 사용해야하며 루프의 각 문서에 대해 새 인스턴스를 인스턴스화하는 것이 좋습니다. isIgnoringPositions()isIgnoringOffsets()을 무시하여 작업 속도를 상당히 높일 수 있습니다. 귀하의 개체는 그 둘 모두에 대해 true을 반환해야합니다. TermVectorMappersetExpectations 메소드를 강제로 정의 할 수도 있지만 아무 것도 할 필요가없는 것 같습니다.

일단지도를 작성했으면 빈도를 내림으로써지도 항목을 정렬하고 좋아하는 많은 상위 검색어를 읽으십시오. 사전에 얼마나 많은 단어가 필요한지 알고 있다면 멋진 힙 기반 알고리즘을 사용하여 O (n 로그 n) 정렬을 사용하는 대신에 k 항목을 선형 시간으로 찾을 수 있습니다. . 나는 평범한 구식이 실제로는 충분히 빠를 것이라고 상상한다. 그러나 그것은 당신에게 달려 있습니다.

원하는 경우 HitCollectorgetTermFreqVector으로 직접 호출하여 처음 두 단계를 결합 할 수 있습니다. 이것은 분명히 똑같이 정확한 결과를 만들어야하며 직관적으로 더 쉽고 간단하게 보이지만 문서는 HitCollector 예제와 같은 페이지에서 두 단계 접근 방법보다 상당히 느릴 수 있다고 경고하는 것 같습니다. 위). 또는 나는 그들의 경고를 잘못 해석 할 수있다. 자신이 야심 차게 느끼는 경우 두 가지 방법을 시도해보고 비교하고 알려주십시오.

+1

히트가 많은 경우 특히 느려질 수 있습니까? – jjxtra

0

TermVectors를 계산하면되지만 반복 할 문서가 많은 경우 속도가 느려집니다. 또한 docFreq를 상위 용어로 사용하는 경우에는 TermFreqVector에서 해당 용어를 2 진수로 계산하지 마십시오.

또는 패싯 개수와 같은 용어를 반복 할 수 있습니다. 매 학기마다 cached filter을 사용하십시오. 그들의 BitSets은 빠른 교차 카운트를 위해 사용될 수 있습니다.

관련 문제