2010-05-21 94 views
8

我有一個數據集,其底層文本上有多個註釋層,如part-of-tags,chunks from a shallow parser,name entities和其他各種natural language processing(NLP)工具。對於像The man went to the store一個句子,註釋可能看起來像:索引和搜索Lucene中的Word級別註釋層

 

Word POS Chunk  NER 
==== === ===== ======== 
The DT  NP Person  
man NN  NP Person 
went VBD  VP   - 
to  TO  PP   - 
the DT  NP Location 
store NN  NP Location 

我想指數一堆有了這樣的使用Lucene批註文檔,然後在不同的層進行搜索。簡單查詢的一個例子是檢索華盛頓被標記爲的所有文檔。雖然我不是絕對致力於符號,語法如下最終用戶可能輸入查詢:

查詢Word=Washington,NER=Person

我也想這樣做涉及順序更復雜的查詢跨越不同層的註釋,例如找到所有有文字標記的文件後面跟着arrived at後跟一個標籤位置。這樣的查詢可能如下:

查詢"NER=Person Word=arrived Word=at NER=Location"

什麼是去使用Lucene接近這個好辦法?無論如何索引和搜索包含結構化令牌的文檔字段?

有效載荷

一個建議是嘗試使用Lucene的payloads。但是,我認爲有效載荷只能用於調整文檔的排名,而且它們不用於選擇返回哪些文檔。

後者很重要,因爲對於某些使用情況,包含模式的文檔的數量確實是我想要的。

另外,只檢查符合查詢條件的有效載荷。這意味着,有效載荷只能甚至與第一例子查詢Word=Washington,NER=Person的排名,因此我們只是想確保長期Washingonton被標記爲Person幫助。但是,對於第二個示例查詢"NER=Person Word=arrived Word=at NER=Location",我需要檢查未指定的標籤,因此不匹配條款。

+0

您是否找到滿意的解決方案? – enguerran 2013-03-17 11:26:42

回答

1

您要尋找的是payloads。清醒的想象力在這個問題上有一個detailed blog entry。有效負載允許您存儲關於單個術語的元數據字節數組。一旦您將數據與有效載荷進行了索引,您就可以創建一個新的相似性機制,在計分時考慮您的有效載荷。

+0

我認爲有效載荷只能用來調整文件的排名。他們是否也可以用於實際選擇返回哪些文檔? – dmcer 2010-05-21 20:52:11

+0

當然,有效載荷與評分一起工作,但評分是檢索文檔的方式。可以根據條款排除文檔 - 考慮NOT查詢。您可能必須編寫自己的QueryParser來完成第二項。 – 2010-05-22 15:58:18

0

您確實可以使用SpanQuery在Lucene中搜索文本的模式,並調整slop距離以限制查詢條件可能發生的彼此之間的相互數量,甚至它們出現的順序。

1

也許一種實現你所要求的方法是在同一位置(即Word,POS,Chunk,NER)對每個註解類別進行索引,並用一個唯一的字符串爲每個註釋加上前綴。不要打擾詞的前綴。您將需要一個自定義分析器來保留前綴,但是您應該能夠使用您想要查詢的語法。

具體而言,我的建議是,你索引處的指定位置下列標記:

Position Word POS  Chunk  NER 
======== ==== ===  =====  ======== 
1  The POS=DT CHUNK=NP NER=Person  
2  man POS=NN CHUNK=NP NER=Person 
3  went POS=VBD CHUNK=VP  - 
4  to  POS=TO CHUNK=PP  - 
5  the POS=DT CHUNK=NP NER=Location 
6  store POS=NN CHUNK=NP NER=Location 

要獲得語義,使用SpanQuerySpanTermQuery保存令牌序列。

我還沒有試過,但在相同的位置索引不同類的術語應當允許位置敏感的查詢做計算表達式,如

NER =人趕到NER正確的事情=位置

請注意與您的示例的區別:我刪除了Word =前綴以將其視爲默認值。此外,您選擇的前綴語法(例如,「class =」)可能會限制您正在索引的文檔的內容。確保文檔不包含短語,或者在預處理中以某種方式逃避它們。當然,這與您需要使用的分析儀有關。

更新:我用文字這種技術用於索引句子和段落的邊界(使用break=senbreak=para令牌),這樣我可以決定在哪裏打破短語查詢匹配。似乎工作得很好。