2011-02-15 16 views
5

Belgelerdeki terimlerin sıklığını almak için Lucene'yi kullanıyorum, ör. Her belgede belirli bir terimin sayısı. Bu amaçla IndexReader.termDocs() kullanıyorum ve tek kelimelik terimler için iyi çalışıyor, ancak tüm kelimeler dizinde ayrı olarak depolandığından, çok sözcüklü terimler için çalışmaz. Ben "sepet-top" teriminin frekansta ilgileniyorum (hatta "sepet topu"), ancak tokenizing sonra iki kelime olacak, ben olacağım:Lucene'de çok kelimeli terimlerin sıklığı nasıl elde edilir?

Örnek (this soruya alınan) "Sepet" terimi ve "top" teriminin terimini alabilmekle birlikte "sepet topu" terimini kullanamazlar.

Sıklıkla almak istediğim tüm çok kelimelik terimleri biliyorum, ayrıca orijinal metni saklamakla ilgilenmiyorum - yalnızca istatistik elde etme. Yani, benim ilk yaklaşım benim bir terim içinde sadece birleşik kelimeler oldu. Örneğin. "Kurt Vonnegut sevdiğim yazar olan" "Ben dün sepet topu oynadı" olur "Dün basketbol oynadığı" ve olur "Favori yazar Kurt Vonnegut olduğunu". Bu bir işe yarar: Birleştirilmiş terimler başka herhangi bir tek kelime gibi ele alınır, bu yüzden kolayca frekans alabilirim. Ancak bu yöntem çirkin ve daha önemlisi çok yavaştır. Ben de başka birine geldim.

Benim ikinci yaklaşım belirteçleri yakalamak ve onlar değiştirilecek terimlerin parçası (Lucene in Action den SynonymFilter gibi bir şey) olup olmadığını kontrol edecek özel belirteç filtreyi, yazmaktır. Bizim örneğimizde, filtre "sepet" kelimesini gördüğünde bir tane daha belirtecektir ve eğer "top" ise, filtre iki ("sepet" ve "top") yerine bir terim ("basketbol") yerleştirecektir. bir çıkış belirteci akışı. Bu yöntemin bir öncekine kıyasla avantajı, tam kelimeler arasındaki eşleşmeleri araştırması ve alt dizeler için tam metni taramamasıdır. Aslında, çoğu belirteçler farklı uzunluklara sahip olacak ve bu yüzden herhangi bir harfin yazışmalarını kontrol etmeden atılacaktır. Ancak böyle bir filtrenin yazması kolay değildir, ayrıca, ihtiyaçlara uyacak kadar hızlı olacağından emin değilim. Düşündüğüm

Üçüncü yaklaşım aynı belgelerde iki kelime ait pozisyonları ile oynamak etmektir. Ancak, büyük olasılıkla, sıklık alma süresi boyunca TermDocs üzerinden yinelemeyi içerecek ve bu da endeksleme zamanından çok daha fazla maliyetli olacaktır.

Son olarak, sorum şu: Lucene'de çok sözcüklü terimlerin sıklığını indekslemenin ve almanın bir yolu var mı?

cevap

6

Yukarı bak shingling. Bu, terimlerin gruplarını gösterir. Solr 1.4 kitabında. Eğer dize varsa ve here

Yani: "Basket topu 1900'lerin başında başlamış

tüm bireysel terimler endeksli, ama geri alacağı

sonra da."

"sepet topu" " " " başladı " 1900'lerin başlarında" vb .../:

ve yapılandırma yoluyla

, ayrıca

"1900 başlarında" vs ... buldum

+0

Lucene en [ShingleFilter] (http "top başlayan" "sepet topu başlatan" http://lucene.apache.org/java/3_0_3/ tam olarak ihtiyacım olan api/contrib-analyers/org/apache/lucene/analysis/shingle/ShingleAnalyzerWrapper.html), teşekkürler! – ffriend

İlgili konular