2009-03-20 3 views
6

TermVectorFrequencies 클래스를 통하지 않고 Lucene 인덱스에서 용어 빈도를 얻는 빠르고 쉬운 방법은 대규모 콜렉션에 많은 시간이 걸립니까?Lucene에서 용어 빈도를 얻으십시오

내가 말하고자하는 것은 문서의 빈도뿐만 아니라 용어 빈도도 가지고있는 TermEnum과 같은 것입니까?

업데이트 : TermDocs를 사용하는 것이 너무 느립니다.

답변

8

TermDocs을 사용하면 주어진 문서의 빈도를 확인할 수 있습니다. 문서 빈도와 마찬가지로 관심 용어를 사용하여 IndexReader에서 용어 문서를 얻습니다.


어떤 일반성을 잃지 않고 TermDocs보다 빠른 방법을 찾을 수 없습니다. TermDocs은 색인 세그먼트의 ".frq"파일에서 직접 읽습니다. 여기서 각 용어 빈도는 문서 순서로 나열됩니다.

"너무 느린"경우 여러 세그먼트를 단일 세그먼트로 병합하도록 색인을 최적화했는지 확인하십시오. 문서를 순서대로 반복합니다 (건너 뛰어도 괜찮지 만 문서 목록에서 효율적으로 앞뒤로 건너 뛸 수는 없습니다).

다음 단계는 SkipData을 제외하는보다 전문화 된 파일 구조를 만드는 추가 처리 일 수 있습니다. 개인적으로는 내 목표를 달성하거나 더 나은 하드웨어를 제공하는 더 나은 알고리즘을 찾으려고합니다 — RAMDirectory을 보유하거나 고유 한 파일 캐싱 시스템에서 사용하기 위해 OS에 제공하는 많은 메모리가 필요합니다.

1

TermDocs은 용어가 들어있는 각 문서에서 주어진 용어의 TF를 제공합니다. 각 < 문서를 반복하여 DFT를 얻을 수 있으며, 주파수는 > 쌍이며 쌍수를 계산하지만 TermEnums가 더 빨라야합니다. IndexReader에는 주어진 Term 및 색인에 대해 TermDocs를 반환하는 termDocs(Term) method이 있습니다.

+0

이 방법을 사용하면 용어 빈도를 결정하는 데 Lucene 쿼리의 결과 집합을 사용할 수 있습니까? –

+0

PhraseFrequency를 얻기 위해 termDocs를 사용할 수 있습니까? – Dany

2

Lucene의 트렁크 버전 (결국 4.0)은 이제 TermsEnum의 각 용어에 대해 totalTermFreq()를 노출합니다. 이 용어는 모든 콘텐츠에이 용어가 나타나는 총 횟수입니다 (그러나 docFreq와 마찬가지로 삭제를 고려하지 않음).

+0

lucene 4.0을 사용하면 td.read (doc, freq)와 동일합니다. 여기서 td는 TermDoc이고 doc와 freq는 int []입니까? – lizzie

관련 문제