Lucene SpanQuery を使用して、「赤」、「緑」、「青」という用語がすべて 1 つの文に含まれる箇所をすべて見つけることはできますか?
私の最初の (不完全/不正確な) アプローチは、特別なセンテンス マーカー トークンとセンテンスの先頭をセンテンスの最初の単語と同じ位置に配置し、次のようなクエリを実行するアナライザーを作成することです。
SpanQuery termsInSentence = new SpanNearQuery(
SpanQuery[] {
new SpanTermQuery( new Term (MY_SPECIAL_SENTENCE_TOKEN)),
new SpanTermQuery( new Term ("red")),
new SpanTermQuery( new Term ("green")),
new SpanTermQuery( new Term ("blue")),
},
999999999999,
false
);
SpanQuery nextSentence = new SpanTermQuery( new Term (MY_SPECIAL_SENTENCE_TOKEN));
SpanNotQuery notInNextSentence = new SpanNotQuery(termsInSentence,nextSentence);
もちろん問題は、それnextSentence
が実際には次の文ではなく、一致する文の中のものを含む任意の文マーカーであることです。termsInSentence
したがって、これは機能しません。
次のアプローチは、トークンを文の前(つまり、最初の単語と同じ位置ではなく、最初の単語の前) に配置するアナライザーを作成することです。これに関する問題は、 によって引き起こされる余分なオフセットを考慮しなければならないことですMY_SPECIAL_SENTENCE_TOKEN
。さらに、 USS Enterprise/\.\s+[A-Z0-9]/
を検索するときにすべての (偽の) 文マーカーを考慮する必要があるため、単純なパターンを使用して文を分割する (例: split on ) 場合、これは最初は特に問題になります。
では...どうやってこれにアプローチすればいいですか?