Có thể sử dụng Lucene SpanQuery để tìm tất cả các lần xuất hiện mà các thuật ngữ "đỏ" "xanh lục" và "xanh" tất cả xuất hiện trong một câu không?Tìm kiếm nhận biết câu với Lucene SpanQueries
Cách tiếp cận đầu tiên (không đầy đủ/không chính xác) của tôi là viết một trình phân tích đặt một dấu hiệu dấu câu đặc biệt và bắt đầu câu ở cùng vị trí với từ đầu tiên của câu và sau đó truy vấn tương tự sau:
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);
vấn đề, tất nhiên, là nextSentence
là không thực sự tiếp theo câu, đó là bất kỳ câu đánh dấu, trong đó có một trong những câu nói đó termsInSentence
trận đấu. Do đó điều này sẽ không hoạt động.
Cách tiếp cận tiếp theo của tôi là tạo trình phân tích đặt mã thông báo trước câu (nghĩa là trước từ từ đầu tiên thay vì ở cùng vị trí với từ đầu tiên). Vấn đề với điều này là sau đó tôi phải tính đến khoản bù trừ thêm gây ra bởi MY_SPECIAL_SENTENCE_TOKEN
. Hơn nữa, điều này đặc biệt xấu khi tôi sử dụng một mẫu ngây thơ để chia nhỏ các câu (ví dụ: tách trên /\.\s+[A-Z0-9]/
) vì tôi sẽ phải tính tất cả các dấu câu (sai) khi tìm kiếm USS Enterprise.
Vậy ... tôi nên tiếp cận điều này như thế nào?