2014-05-18 2 views
1

Lucene을 통해 명시 적 의미 분석 (ESA)을 구현하려고합니다.Lucene의 문서 유사성 계산에서 검색어 tfidf를 사용하는 방법

문서를 검색 할 때 쿼리에서 용어 TFIDF를 고려하려면 어떻게해야합니까?

  • 검색어 : 예를 들어

    "abcada"

  • DOC1 "ABA"
  • Doc2 : "ABC"

쿼리가 2

보다 더 DOC1 일치해야합니다

성능에 영향을주지 않고이 기능을 사용하고 싶습니다.

나는 쿼리 향상을 통해이를 수행하고 있습니다. TFIDF와 관련하여 용어를 부각시킴으로써

더 좋은 방법이 있습니까?

답변

1

Lucene은 이미 기본적으로 TF/IDF 채점을 지원하므로 찾고있는 것이 무엇인지 이해하지 못합니다.

쿼리 자체 내에서 TF/IDF를 기반으로 쿼리 용어의 무게를 측정하는 것처럼 실제로 들리는 것 같습니다.

  • TF : Lucene은 각 검색어의 점수를 합산합니다. 동일한 질의 용어 (field:(a a b) 같은) 쿼리에 두번 나타나는 경우 (아니오 동일한 의미가 있지만)를 두배 용어는 2

  • IDF 의해 승압 비교 무거운 중량을받을 않을 것이다 : IDF는간에 데이터를 참조하여 여러 문서 모음. 하나의 쿼리 만 있기 때문에 이것은 적용되지 않습니다. 당신이 그것에 대해 기술 취득하려는 경우 또는 모든 용어들은 그래서, IDF 정말 맥락에서 이해가되지 않습니다 1.

의 IDF가 있고, TF는 이미 당신을 위해 수행됩니다. 그래서, 당신은 정말로 아무것도 할 필요가 없습니다.

다른 점수 요소가 있다는 것을 명심하십시오. 여기서 coord 요소가 중요합니다.

  • a b a
  • a b c 쿼리 용어의 다섯 일치 (a b a c a,하지만 d)

그래서, 특정 채점 요소가 될 쿼리 용어의 네 일치 (a b a a,하지만 c d) 두 번째 문서를 더 강하게 평가하십시오.여기


는 doc a b a 대한 explain ( IndexSearcher.explain 참조) 출력이다 :

0.26880693 = (MATCH) product of: 
    0.37 = (MATCH) sum of: 
    0.10876686 = (MATCH) weight(text:a in 0) [DefaultSimilarity], result of: 
     0.10876686 = score(doc=0,freq=2.0 = termFreq=2.0 
), product of: 
     0.25872254 = queryWeight, product of: 
      0.5945349 = idf(docFreq=2, maxDocs=2) 
      0.435168 = queryNorm 
     0.42039964 = fieldWeight in 0, product of: 
      1.4142135 = tf(freq=2.0), with freq of: 
      2.0 = termFreq=2.0 
      0.5945349 = idf(docFreq=2, maxDocs=2) 
      0.5 = fieldNorm(doc=0) 
    0.07690979 = (MATCH) weight(text:b in 0) [DefaultSimilarity], result of: 
     0.07690979 = score(doc=0,freq=1.0 = termFreq=1.0 
), product of: 
     0.25872254 = queryWeight, product of: 
      0.5945349 = idf(docFreq=2, maxDocs=2) 
      0.435168 = queryNorm 
     0.29726744 = fieldWeight in 0, product of: 
      1.0 = tf(freq=1.0), with freq of: 
      1.0 = termFreq=1.0 
      0.5945349 = idf(docFreq=2, maxDocs=2) 
      0.5 = fieldNorm(doc=0) 
    0.10876686 = (MATCH) weight(text:a in 0) [DefaultSimilarity], result of: 
     0.10876686 = score(doc=0,freq=2.0 = termFreq=2.0 
), product of: 
     0.25872254 = queryWeight, product of: 
      0.5945349 = idf(docFreq=2, maxDocs=2) 
      0.435168 = queryNorm 
     0.42039964 = fieldWeight in 0, product of: 
      1.4142135 = tf(freq=2.0), with freq of: 
      2.0 = termFreq=2.0 
      0.5945349 = idf(docFreq=2, maxDocs=2) 
      0.5 = fieldNorm(doc=0) 
    0.10876686 = (MATCH) weight(text:a in 0) [DefaultSimilarity], result of: 
     0.10876686 = score(doc=0,freq=2.0 = termFreq=2.0 
), product of: 
     0.25872254 = queryWeight, product of: 
      0.5945349 = idf(docFreq=2, maxDocs=2) 
      0.435168 = queryNorm 
     0.42039964 = fieldWeight in 0, product of: 
      1.4142135 = tf(freq=2.0), with freq of: 
      2.0 = termFreq=2.0 
      0.5945349 = idf(docFreq=2, maxDocs=2) 
      0.5 = fieldNorm(doc=0) 
    0.6666667 = coord(4/6) 

그리고 문서 a b c를 들어, 원하는대로, 용어 a 대해 일치받는 것을

0.43768594 = (MATCH) product of: 
    0.52522314 = (MATCH) sum of: 
    0.07690979 = (MATCH) weight(text:a in 1) [DefaultSimilarity], result of: 
     0.07690979 = score(doc=1,freq=1.0 = termFreq=1.0 
), product of: 
     0.25872254 = queryWeight, product of: 
      0.5945349 = idf(docFreq=2, maxDocs=2) 
      0.435168 = queryNorm 
     0.29726744 = fieldWeight in 1, product of: 
      1.0 = tf(freq=1.0), with freq of: 
      1.0 = termFreq=1.0 
      0.5945349 = idf(docFreq=2, maxDocs=2) 
      0.5 = fieldNorm(doc=1) 
    0.07690979 = (MATCH) weight(text:b in 1) [DefaultSimilarity], result of: 
     0.07690979 = score(doc=1,freq=1.0 = termFreq=1.0 
), product of: 
     0.25872254 = queryWeight, product of: 
      0.5945349 = idf(docFreq=2, maxDocs=2) 
      0.435168 = queryNorm 
     0.29726744 = fieldWeight in 1, product of: 
      1.0 = tf(freq=1.0), with freq of: 
      1.0 = termFreq=1.0 
      0.5945349 = idf(docFreq=2, maxDocs=2) 
      0.5 = fieldNorm(doc=1) 
    0.07690979 = (MATCH) weight(text:a in 1) [DefaultSimilarity], result of: 
     0.07690979 = score(doc=1,freq=1.0 = termFreq=1.0 
), product of: 
     0.25872254 = queryWeight, product of: 
      0.5945349 = idf(docFreq=2, maxDocs=2) 
      0.435168 = queryNorm 
     0.29726744 = fieldWeight in 1, product of: 
      1.0 = tf(freq=1.0), with freq of: 
      1.0 = termFreq=1.0 
      0.5945349 = idf(docFreq=2, maxDocs=2) 
      0.5 = fieldNorm(doc=1) 
    0.217584 = (MATCH) weight(text:c in 1) [DefaultSimilarity], result of: 
     0.217584 = score(doc=1,freq=1.0 = termFreq=1.0 
), product of: 
     0.435168 = queryWeight, product of: 
      1.0 = idf(docFreq=1, maxDocs=2) 
      0.435168 = queryNorm 
     0.5 = fieldWeight in 1, product of: 
      1.0 = tf(freq=1.0), with freq of: 
      1.0 = termFreq=1.0 
      1.0 = idf(docFreq=1, maxDocs=2) 
      0.5 = fieldNorm(doc=1) 
    0.07690979 = (MATCH) weight(text:a in 1) [DefaultSimilarity], result of: 
     0.07690979 = score(doc=1,freq=1.0 = termFreq=1.0 
), product of: 
     0.25872254 = queryWeight, product of: 
      0.5945349 = idf(docFreq=2, maxDocs=2) 
      0.435168 = queryNorm 
     0.29726744 = fieldWeight in 1, product of: 
      1.0 = tf(freq=1.0), with freq of: 
      1.0 = termFreq=1.0 
      0.5945349 = idf(docFreq=2, maxDocs=2) 
      0.5 = fieldNorm(doc=1) 
    0.8333333 = coord(5/6) 

참고 첫 번째 문서에서 더 높은 가중치를 사용하면 각 독립형을 볼 수도 있습니다 a 따로 평가하고 점수에 더한다.

그러나 두 번째 문서에서 용어 "c"의 coord와 idf의 차이에 유의하십시오. 이러한 점수의 영향은 같은 단어의 배수를 더하면 부스트가 사라집니다. 쿼리에 a 초를 추가하면 결국 장소가 바뀝니다. c에 성냥은 멀리 더 중대한 결과 평가되는 다만이다.

+0

Lucene은 TF/IDF 채점을 기본적으로 지원하지만 이미 색인 된 문서에 대해서만 지원합니다. 귀하는 자신의 TF/IDF를 기반으로 질의어의 무게를 재고 싶다는 것을 정확하게 이해했습니다. IDF는 TF가 쿼리 자체에서 나오는 동안 인덱싱 된 문서에서 가져옵니다. – Diaa

+0

여기서 coord 요소는 어떻게 다릅니 까? 나는 aba가 a를 위해 더 높은 TF를 가지고 있고 그 질의 또한 고려해야 할 TF가 높기를 바란다. – Diaa

+0

IDF는 이미 고려되었으며 실제로 요청한 결과에 반하여 작동합니다. c는 두 개가 아닌 하나의 문서에서만 발생하기 때문에 더 높은 점수를 얻습니다. 설명했듯이 부울 쿼리가 어떻게 가산 점수를 받는지 간단히 설명합니다. 검색어가 많을수록 점수가 높아 지므로 검색어 TF도 이미 처리됩니다. 'coord'는 명시된대로 원하는 결과에 대해 작동합니다. 더 많은 검색어 조건 일치 = 높은 점수. doc1에 대한 coord는 4/6입니다. doc2에 대한 coord는 5/6입니다. idf와 coord 사이에서 'c'에 대한 일치는 훨씬 더 중요한 점수 영향입니다. – femtoRgon