Ta xét một số truy vấn Bool như sau:
1. Các tài liệu chứa từ “Java”
2. Các tài liệu chứa từ “Java” nhưng không có từ “coffee”
3. Các tài liệu chứa cụm từ “Java beans” hoặc “API”
4. Các tài liệu nơi từ “Java” và “island” nằm trong cùng một câu
Trong đó, truy vấn 1 và 2 là các truy vấn đơn giản bao gồm mối quan hệ giữa các cụm từ và các tài liệu, truy vấn 3 và 4 là các truy vấn proximity (liên quan) bởi vì chúng có cả mối liên hệ giữa các chuỗi với nhau.
Các tài liệu trong tập hợp được phân chuỗi (tokenization) theo cách phù
chuỗi không rỗng bao gồm các ký tự không phải dấu phân cách (space) và dấu câu; với ngôn ngữ HTML, cần lọc bỏ các thẻ (tag) với các ký tự phân cách < và >. Mỗi chuỗi trong bản sao lục được biểu diễn theo một số nguyên phù hợp, tid, (thường là 32 bits). Do đó, một tài liệu được chuyển thành chuỗi các số nguyên.
Để hỗ trợ cho việc trích chọn thông tin, tùy thuộc vào từng ứng dụng mà cần xử lý các từ theo các cách khác nhau. Thí dụ, các từ có thể chuyển về dạng cơ bản (downcased – conflation, thí dụ: is, are, were chuyển trở thành be), hay các hậu tố của từ có thể được lược bỏ (stemming, thí dụ: running chuyển thành run). Sau khi chuyển đổi, một tài liệu (did) sẽ được biểu diễn theo một chuỗi số nguyên (tid, pos).
Thí dụ ta có hai tài liệu như sau:
Chúng được biểu diễn dưới dạng bảng như sau:
Ở đây, tid, did, và pos tương ứng với token ID, document ID và position. Với bảng ở trên, trả lời cho các truy vấn ở trên là đơn giản như sau:
Mặc dù cột thứ ba của bảng làm cho việc viết các truy vấn theo từ khóa dễ dàng hơn, lưu trữ nó là một thách thức lớn về không gian.
Về việc lưu trữ các token, cách thực thi dễ hiểu nhất là sử dụng cơ sở dữ liệu quan hệ, với không gian lưu trữ cao đến cỡ 10 lần kích thước của văn bản gốc. Truy cập tới bảng này cho tất cả các truy vấn ở trên là theo một quy cách chung: cho một cụm từ, chuyển nó thành tid, sử dụng tiếp cho việc khảo sát tài liệu, lấy ra tập các cụm (did, pos), sắp xếp theo thứ tự từ điển.
Với các truy vấn không bao gồm thông tin về vị trí cụm từ, bỏ qua pos
và sắp xếp theo did, cách làm này sẽ hữu ích với việc tìm hợp, giao và tập loại trừ theo did. Do đó, ta có thể giảm lưu trữ cần thiết bằng cách ánh xạ tid tới một bộ đệm được sắp xếp theo dạng từ điển của (did, pos). Nếu như tìm kiếm liên quan là không cần thiết, ta có thể bỏ qua thông tin vị trí và giảm kích thước lưu trữ được hơn nữa. Cả hai cách định chỉ số được chỉ ra trên Hình eee. Thực tế, việc định chỉ số là nhận một ma trận tài liệu – nhóm (document- term matrix) và chuyển thành ma trận nhóm – tài liệu (term-document matrix), cũng là lý do cho tên gọi định chỉ số nghịch chuyển (nghịch đảo – inverted indexing), mặc dù chuyển vị (transposing) mới là mô tả chính xác hơn.
Hình 2.6: Hai dạng khác nhau của cấu trúc dữ liệu chỉ số nghịch chuyển, thường được lưu trữ trên đĩa. Phiên bản đơn giản hơn ở giữa không lưu trữ các thông tin về vị trí các từ trong tài liệu; phiên bản phía bên phải lưu cả thông tin vị trí. Ánh xạ từ nhóm tới các tài liệu và vị trí (được viết theo kiểu “tài liệu/vị trí”) có thể được thực hiện nhờ sử dụng cây nhị phân B-tree hoặc bảng băm.
Trong việc quản lý lưu trữ tài liệu, bộ lưu trữ Berkeley DB2 là lựa chọn hợp lý trong việc duy trì ánh xạ từ tid tới các bản ghi của tài liệu; hữu hiệu nhất với các tệp sao lục động (dynamic corpora), nơi mà các tài liệu thường chịu thao tác thêm, sửa, xóa. Với các tập hợp tĩnh (một cách tương đối) cần các tùy chọn định chỉ số hiệu quả hơn về mặt không gian, sẽ được thảo luận ở phần 2.3.1.3 (Công nghệ nén chỉ số).
2.1.20.1 Từ dừng và stemming
Các ngôn ngữ tự nhiên thường có các từ được gọi là từ chức năng và liên từ như là mạo từ, giới từ, chúng xuất hiện nhiều trong các tài liệu và thường ít được sử dụng để xác định ý nghĩa của tài liệu hay để thỏa mãn thông tin mà người tìm kiếm cần. Chúng được gọi là các stopword (từ dừng, thí dụ: trong
tiếng Anh: a, an, the, on…).
Các côn cụ tìm kiếm thường không định chỉ số các stopword, nhưng sẽ thay thế chúng bởi placeholder (trình giữ chỗ) để lưu lại vị trí mà stopword xuất hiện, để có thể hỗ trợ cho các cụm truy vấn tìm kiếm có chứa cả stopword, như là “Gone with the wind”. Giảm không gian chỉ số và tăng hiệu năng là các nguyên nhân quan trọng cho việc loại trừ các stopword. Tuy nhiên, một số truy vấn như là “to be or not to be” – chỉ chứa stopword sẽ bị loại trừ. Ngoài ra, còn có vấn đề về các từ đa nghĩa, như là can là một động từ thì không hữu ích trong truy vấn theo từ khóa, nhưng can là danh từ thì lại có thể là trung tâm của một truy vấn, do đó, nó sẽ bị loại khỏi danh sách stopword.
Stemming hay conflation (làm mịn) là một phương tiện khác để giúp kết nối một cụm cần truy vấn với một biến thể về hình thái trong tập sao lục, bằng cách loại bỏ các biến đổi do cách diễn đạt, thì (thời) và các con số, thí dụ:
university và universal đều được xem là universe. Stemming có thể giúp tăng số lượng các tài liệu phản hồi (recall), nhưng đồng thời cũng có thể bao gồm các tài liệu không liên quan. Về độ chính xác, đặc biệt là trong việc tìm kiếm trên Web, có nhiều thuật ngữ viết tắt, đa nghĩa và các tên gọi được tạo ra trong kỹ thuật và thương mại, có thể stemming trở nên sai hoàn toàn: thí dụ, tóm gọn “ides” thành “IDE”, “SOCKS” thành “sock”, “gated” thành “gate”…
2.1.20.2 Định chỉ số theo khối và cập nhật
Với các hệ thống định chỉ số cỡ lớn (như là được sử dụng trong Web công cụ tìm kiếm), ánh xạ được chỉ ra trong Hình (3.1) không được xây dựng theo kiểu thêm vào tập hợp từng tài liệu một, vì sẽ tốn nhiều thời gian truy cập ngẫu nhiên đĩa (I/O), và xảy ra phân mảnh đĩa ở mức cao.
Thêm một chút không gian lưu trữ, ta có thể thay thế cập nhật về chỉ số của các posting có độ dài biến đổi bằng việc trộn có sắp xếp đơn giản (simple
sort-merges). Khi các tài liệu được duyệt, bảng posting ban đầu được sắp xếp theo thứ tự (d, t). Thao tác cơ bản của việc “nghịch đảo” chỉ số chuyển vị thành sắp xếp theo thứ tự (t, d), được biểu diễn trong Hình 2.7.
Hình 2.7: Cách thức các chỉ số được duy trì trong tập hợp động.
Mỗi khi bản ghi posting thuộc thứ tự (t, d) (cùng với thông tin về vị trí), cấu trúc dữ liệu được chỉ trong hình 3.1 có thể được tạo ra dễ dàng.
Với một tập hợp động nơi mà các tài liệu được thêm, sửa hoặc xóa, một thay đổi đơn giản ở mức tài liệu có thể cần phải cập nhật hàng trăm tới hàng nghìn bản ghi, tạo thành khối các tài liệu (documents in flux). Các tài liệu trong khối được biểu diễn theo bản ghi (d, t) được đánh dấu, như là (d, t, s) với s là một bit để xác định tài liệu d đó có phải bị xóa hay thêm mới hay không.
Các tài liệu (d, t, s) được định chỉ số để tạo ra một chỉ số “stop-press” (chỉ định dừng). Một truy vấn của người sử dụng được gửi tới cả chỉ số chính và chỉ số stop-press. Giả sử chỉ số chính trả về tập tài liệu D0. Chỉ số stop-press trả về hai tập tài liệu: thứ nhất là D+ : tập các tài liệu phù hợp với truy vấn chưa được định chỉ số trong D0, và thứ hai là D- : tập các tài liệu phù hợp với truy vấn và đã bị loại khỏi tập hợp từ khi D0 được xây dựng. Câu trả lời cuối cùng cho truy vấn là D0∪ D+ \ D− .
Chỉ số stop-press được tạo một cách nhanh chóng và do đó không được xây dựng cẩn thận và chặt chẽ như là chỉ số chính. Khi mà chỉ số stop-press trở nên quá lớn, các bản ghi được đánh dấu (d, t, s) được sắp xếp theo thứ tự (t, d, s) và được trộn có chọn lọc vào các bản ghi chủ (t, d). Kết quả đó được sử dụng để tái xây dựng chỉ số chính, và chỉ số stop-press có thể được làm rỗng.
2.1.20.3 Kỹ thuật nén chỉ số
Khi lưu trữ chỉ số trong bộ nhớ, cần nén càng nhiều càng tốt, đặc biệt là với các hệ thống cài đặt IR hiệu năng cao (như là công cụ tìm kiếm trên Web). Phần lớn trong không gian chỉ số bị chiếm chỗ bởi ID của các tài liệu. Tập hợp lưu trữ càng lớn, thì số bit được sử dụng để biểu diễn mỗi ID tài liệu cũng lớn theo.
Cách đơn giản nhất để tiết kiệm không gian lưu trữ ID của tài liệu là sắp xếp chúng theo thứ tự tăng dần, lưu trữ ID đầu tiên một cách đầy đủ, rồi với các ID tài liệu sau đó chỉ cần lưu trữ sai khác với ID liền trước, gọi là các
khoảng cách. Cách này là mã hóa Delta. Thí dụ, nếu từ bottle xuất hiện trong các tài liệu số 5, 30, 31 thì bản ghi của bottle là vector (5, 25, 1).
Vấn đề tiếp theo là làm thế nào để mã hóa các khoảng cách theo một số bit biến đổi, để cho một khoảng cách nhỏ có chi phí bit thấp hơn một ID tài liệu. Với mã hóa nhị phân dạng chuẩn - cho phép mã hóa tất cả các ký tự hoặc
giá trị theo độ dài bit bằng nhau – là tối ưu khi tất cả các giá trị gần như nhau, không giống với trường hợp các khoảng cách. Cách khác là mã Unary (một khoảng cách x được biểu diễn theo x – 1 theo sau bởi một dấu hiệu kết thúc), chú trọng vào các khoảng cách ngắn (mã là tối ưu nếu như xác suất của các
khoảng cách lớn giảm theo hàm mũ Pr(X = x) = 2-x). Ở giữa là mã Gamma,
biểu x như là:
1. Mã Unary của 1+logx, theo sau bởi
2. x -2logx được biểu diễn theo mã nhị phân, cỡ chừng logx bit khác.
Do đó, khoảng cách x được mã hóa trong khoảng 1 + 2log x bit. Thí dụ, số 9 được biểu diễn như là “1110001”. Một cách cải tiến tốt hơn nữa là dùng mã Golomb [Mining the Web].
Ngược với các phương thức được thảo luận ở trên, ta tìm cách thức nén
lossy để có thể cân đối giữa không gian và thời gian. Một cách tiếp cận lossy là tập hợp các tài liệu theo khối (bucket). Giả sử ta có một triệu tài liệu, với ID 20-bit. Ta có thể phân bổ chúng theo 1000 khối, mỗi khối có 1000 tài liệu, ID của khối chỉ là 10-bit. Một chỉ số nghịch chuyển chỉ được xây dựng từ các nhóm từ tới ID của khối, điều này sẽ tiết kiệm nhiều không gian bởi vì ID của “tài liệu” giảm còn một nửa kích thước của chúng. Nhưng khi một khối phản hồi cho một truy vấn, tất cả các tài liệu trong khối đó cần được duyệt qua, tốn nhiều thời gian. Để tránh điều này, ta có thể định chỉ số tài liệu theo mỗi khối riêng biệt. Glimpse (webglimse.org) sử dụng kỹ thuật này để giới hạn không gian sử dụng.
Tổng quát, đạt được tỉ số nén cao thì sẽ khó khăn trong việc cập nhật, khi tài liệu được thêm, sửa, xóa hay thay đổi; còn tăng kích thước lưu trữ thì sẽ gặp thách thức về truy cập ngẫu nhiên đĩa I/O.