2009-08-08 26 views
14

Cách tốt nhất để xử lý từ đồng nghĩa (cụm từ) sử dụng Lucene là gì? Đặc biệt, khi tôi cần thực hiện các truy vấn như: a HOẶC b HOẶC c KHÔNG dTừ đồng nghĩa sử dụng Lucene

Làm cách nào để thêm trường mới được gọi là "từ đồng nghĩa" vào từng tài liệu trong khi lập chỉ mục? Giá trị của trường này sẽ có danh sách tất cả các từ đồng nghĩa. Nó sẽ được thêm vào một tài liệu chỉ khi tài liệu đó có bất kỳ từ đồng nghĩa nào.

Sau đó tôi sẽ thực hiện truy vấn tìm kiếm "OR" sẽ tìm kiếm từ khóa tìm kiếm trong trường này cùng với các trường khác.

Cách tiếp cận này có thể hoạt động tốt cho bất kỳ loại truy vấn nào không?

FYI, Từ đồng nghĩa trong ứng dụng của tôi hoàn toàn tùy chỉnh chứ không phải từ từ điển tiếng Anh ... nghĩa là. "Nhà lãnh đạo toàn cầu về tài chính" cũng có thể có nghĩa là "Ngân hàng đầu tư hàng đầu" hoặc "Công ty tài chính Fortune 500", v.v.

Vui lòng đề nghị.

Cảm ơn.

Trả lời

11

Có một đóng góp cho dự án Lucene được gọi là "wordnet". Theo số its documentation:

Gói này sử dụng các từ đồng nghĩa được WordNet xác định để tạo chỉ mục Lucene lưu trữ chúng, lần lượt có thể được sử dụng để mở rộng truy vấn. Bạn thường chạy Syns2Index một lần để xây dựng chỉ mục truy vấn/"cơ sở dữ liệu", và sau đó gọi SynExpand.expand (...) để mở rộng truy vấn.

Nó bao gồm một mẫu của những gì nó làm:

Nếu bạn vượt qua trong truy vấn "con chó lớn", sau đó nó in ra:

Query: big adult^0.9 bad^0.9 bighearted^0.9 boastful^0.9 boastfully^0.9 bounteous^0.9 bountiful^0.9 braggy^0.9 crowing^0.9 freehanded^0.9 giving^0.9 grown^0.9 grownup^0.9 handsome^0.9 large^0.9 liberal^0.9 magnanimous^0.9 momentous^0.9 openhanded^0.9 prominent^0.9 swelled^0.9 vainglorious^0.9 vauntingly^0.9 dog andiron^0.9 blackguard^0.9 bounder^0.9 cad^0.9 chase^0.9 click^0.9 detent^0.9 dogtooth^0.9 firedog^0.9 frank^0.9 frankfurter^0.9 frump^0.9 heel^0.9 hotdog^0.9 hound^0.9 pawl^0.9 tag^0.9 tail^0.9 track^0.9 trail^0.9 weenie^0.9 wiener^0.9 wienerwurst^0.9

Bạn thấy rằng các từ gốc ("big" và "dog") không có trọng số gắn liền với chúng. Các từ đồng nghĩa, tuy nhiên, có một trọng số (0.9) mà bạn có thể cấu hình chính mình.

Nó đi kèm với phân phối chuẩn của Lucene, trong thư mục "đóng góp".

+0

Cảm ơn các đầu vào ur Adam ... Bạn có thể vui lòng tham khảo lại câu hỏi của tôi không? –

+1

Mô-đun WordNet xây dựng chỉ mục Lucene, giống như bạn. Chỉ mục này mà nó xây dựng cuối cùng được sử dụng để mở rộng truy vấn. Nếu bạn chỉ đơn giản là cố gắng xây dựng chỉ mục này từ từ điển của WordNet, tôi chắc chắn bạn có thể dễ dàng biết tên trường nào đang sử dụng cho chỉ mục của nó và thêm chính các mục nhập của riêng bạn. –

0

Tôi thích chạy tìm kiếm bằng cách sử dụng toàn bộ cụm từ đã nhập và trọng lượng bất kỳ thứ gì đã trả về nặng hơn chuỗi tìm kiếm tiếp theo. Sau đó tôi muốn lặp qua từng từ trong cụm từ và tìm kiếm với các kết quả đó với điểm số thấp hơn. Sau đó tôi tổng hợp điểm số cho tất cả các mục được trả về nhiều lần và sắp xếp kết quả cho phù hợp. Điều này có thể không phải là cách tốt nhất 100% để làm điều này ... nhưng nó đã làm việc tuyệt vời cho tôi trong quá khứ.

1

Bạn có thể nhận đối tượng truy vấn sau khi phân tích chuỗi truy vấn đầu vào bằng QueryParser.parse().

Trong hầu hết các trường hợp, truy vấn cấp cao nhất là truy vấn boolean với truy vấn phụ dưới dạng con của nó. Bạn có thể đệ quy lặp lại trên đối tượng truy vấn. Khi bạn nhấn một đối tượng TermQuery hoặc PhraseQuery, bạn có thể nhận được truy vấn (phụ) và thay thế đối tượng truy vấn đó bằng một đối tượng truy vấn boolean bao gồm các synoy của nó, nếu có.

Về cơ bản, bạn đang chuyển truy vấn ban đầu của bạn

a OR b AND c 

để

(a OR synA) OR (b OR synB1 OR synB2) AND c 

Hoạt động ở đối tượng truy vấn đảm bảo rằng bạn chỉ cần thay thế các nút lá của truy vấn với các truy vấn mới và không fiddle với phân cấp truy vấn phức tạp tùy ý.

Các vấn đề liên quan