Chuyển đến nội dung chính
R

RDocumentation: Chấm điểm và Xếp hạng

Tìm hiểu cách kết quả tìm kiếm trên RDocumentation được tạo ra!
Ludovic Vannoorenberghe's photo
Ludovic Vannoorenberghe
Đã cập nhật · 7 phút đọc

Khám phá cùng AI

ChatGPTClaudePerplexity

Tạo tài khoản miễn phí của bạn

Luyện tập và Lộ trình tiến trình của bạn.

Tiếp Tục Với Google
Bằng cách tiếp tục, bạn chấp nhận Điều khoản sử dụng, Chính sách bảo mật và việc dữ liệu của bạn được lưu trữ tại Hoa Kỳ.

Một trong những tính năng cốt lõi của RDocumentation.org là khả năng tìm kiếm. Ngay từ đầu, chúng tôi muốn có một thanh tìm kiếm thật đơn giản, giúp bạn nhanh chóng tìm thấy điều mình cần, thay vì một biểu mẫu phức tạp yêu cầu tên gói, tên hàm, phiên bản hay bất cứ thứ gì khác. Chỉ cần một thanh tìm kiếm đơn giản.

Trong bài blog kỹ thuật hôm nay, chúng tôi sẽ nêu bật các công nghệ và kỹ thuật được dùng để mang đến kết quả phù hợp và có ý nghĩa cho người dùng.

Elasticsearch

RDocumentation.org sử dụng Elasticsearch để lập chỉ mục và tìm kiếm toàn bộ các gói và chủ đề R.

Elasticsearch là một công cụ tìm kiếm mã nguồn mở, có khả năng mở rộng, phân tán, cấp doanh nghiệp.

Elasticsearch rất phù hợp để truy vấn tài liệu vì nó không sử dụng dữ liệu SQL thông thường, mà lưu trữ tài liệu trong cấu trúc dữ liệu giống JSON. Mỗi tài liệu chỉ là một tập các cặp khóa-giá trị với các kiểu dữ liệu đơn giản (chuỗi, số, danh sách, ngày tháng, …). Tính chất phân tán giúp Elasticsearch có thể cực kỳ nhanh.

Một cụm Elasticsearch có thể có nhiều chỉ mục và mỗi chỉ mục có thể có nhiều kiểu tài liệu. Một kiểu tài liệu mô tả cấu trúc của tài liệu sẽ trông như thế nào. Để tìm hiểu thêm về các kiểu trong Elasticsearch, bạn có thể xem hướng dẫn trên elastic.co.

RDocumentation.org sử dụng ba kiểu khác nhau: package_version, topic và package. Hai kiểu đầu là chính; chúng ta sẽ bàn về package sau.

Vì RDocumentation.org là mã nguồn mở, bạn có thể xem các mapping của Elasticsearch trong repo trên github.

Kiểu package_version

Kiểu package_version giống như bản chuyển của tệp DESCRIPTION của một gói, bao gồm các trường chính có trong đó; package_name, version, title, description, release_date, license, url, copyright, created_at, updated_at, latest_version, maintainer và collaborators. Các trường maintainer và collaborators được trích xuất từ trường Authors trong tệp DESCRIPTION

Kiểu topic

Các tài liệu chủ đề được phân tích từ tệp Rd, định dạng tài liệu chuẩn trong R. Kiểu topic có các khóa sau: name, title, description, usage, details, value, references, note, author, seealso, examples, created_at, updated_at, sections, aliases và keywords.

Chấm điểm trong Elasticsearch

Trước khi chấm điểm, Elasticseach trước hết cố gắng thu hẹp tập ứng viên bằng cách kiểm tra tài liệu có thực sự khớp truy vấn hay không. Về cơ bản, một truy vấn là một từ (hoặc một tập từ). Dựa trên thiết lập truy vấn, Elasticsearch sẽ tìm kiếm sự khớp trong các trường nhất định của các kiểu nhất định.

Tuy nhiên, một kết quả khớp không nhất thiết có nghĩa tài liệu đó phù hợp; cùng một từ có thể mang nghĩa khác nhau trong các ngữ cảnh khác nhau. Dựa trên thiết lập truy vấn, chúng ta có thể lọc theo kiểu và trường, và bổ sung nhiều thông tin ngữ cảnh hơn. Thông tin ngữ cảnh này sẽ cải thiện mức độ liên quan và đây là lúc cơ chế chấm điểm phát huy tác dụng.

Elasticsearch sử dụng Lucene bên dưới, nên việc chấm điểm dựa trên Hàm Chấm điểm Thực tiễn của Lucene, kết hợp các mô hình như TF-IDF, Mô hình Không gian Vector và Mô hình Boolean để chấm điểm tài liệu.

Nếu bạn muốn tìm hiểu thêm cách hàm đó được sử dụng trong Elasticsearch, bạn có thể xem phần này của hướng dẫn trên elastic.co.

Một cách để cải thiện mức độ liên quan là áp dụng tăng trọng số (boost) cho một số trường. Ví dụ, trong tìm kiếm toàn văn của RDocumentation.org, chúng tôi tự nhiên tăng trọng cho các trường như package_name và title đối với gói, và aliases và name đối với chủ đề.

Tăng trọng cho tài liệu phổ biến

Một cách hiệu quả khác để cải thiện mức độ liên quan là tăng trọng cho tài liệu dựa trên độ phổ biến của chúng. Ý tưởng là nếu một gói phổ biến hơn, người dùng có khả năng cao sẽ tìm gói đó. Hiển thị các gói phổ biến hơn trước sẽ tăng xác suất chúng tôi đưa ra đúng thứ người dùng đang tìm kiếm.

Dùng lượt tải làm thước đo mức độ phổ biến

Có nhiều cách để đo độ phổ biến. Ta có thể dùng thước đo trực tiếp như bình chọn hay xếp hạng do người dùng đưa ra (như đánh giá sản phẩm trên Amazon), hoặc thước đo gián tiếp như số lượng sản phẩm bán ra hay số lượt xem (đối với video YouTube).

Tại RDocumentation.org, chúng tôi chọn cách thứ hai. Cụ thể hơn, chúng tôi dùng số lượt tải về làm thước đo mức độ phổ biến. Các thước đo gián tiếp thường dễ thu thập hơn vì không cần người dùng chủ động cung cấp.

Khung thời gian

Một vấn đề nảy sinh khi dùng số lượt tải là các gói cũ tự nhiên sẽ có tổng lượt tải nhiều hơn các gói mới. Tuy nhiên, điều đó không có nghĩa chúng phổ biến hơn, mà chỉ vì tồn tại lâu hơn. Giả sử một gói từng rất phổ biến nhiều năm trước, nhưng nay đã lỗi thời và không còn được cộng đồng sử dụng tích cực?

Để giải quyết, chúng tôi chỉ tính số lượt tải trong tháng vừa qua. Cách này giúp điểm phổ biến của các gói cũ không bị thổi phồng một cách giả tạo, và các gói lỗi thời sẽ nhanh chóng mờ dần.

Tải trực tiếp so với tải gián tiếp

Một vấn đề khác phát sinh từ các phụ thuộc ngược. Các gói R thường phụ thuộc vào nhiều gói khác. Những gói có nhiều phụ thuộc ngược sẽ được tải về nhiều hơn hẳn. Tuy nhiên, các gói này thường ở mức thấp và không được người dùng cuối sử dụng trực tiếp. Chúng ta cần tránh gán quá nhiều trọng số cho số lượt tải của chúng.

Ví dụ, hãy xem Rcpp. Hơn 70 phần trăm số gói trên CRAN, mạng lưu trữ R toàn diện, phụ thuộc vào gói này, khiến nó rõ ràng là gói R được tải nhiều nhất. Tuy vậy, khá ít người dùng R sử dụng trực tiếp gói này và tìm tài liệu của nó.

Để giải quyết, chúng tôi cần tách lượt tải trực tiếp (lượt tải xảy ra do người dùng yêu cầu) và lượt tải gián tiếp (lượt tải xảy ra vì một gói phụ thuộc được tải). Để phân biệt lượt tải trực tiếp và gián tiếp từ log của CRAN, chúng tôi dùng cùng phép heuristic được mô tả trong gói cran.stats của Arun Srinivasan.

Giờ đây, chúng tôi có một thước đo mức độ phổ biến có ý nghĩa: số lượt tải trực tiếp trong tháng qua. Elasticsearch cung cấp cách đơn giản để đưa thông tin bổ sung này vào; để biết thêm chi tiết, hãy xem bài viết này trên elastic.co.

Điểm số được điều chỉnh như sau:

new_score = old_score * log(1 + number of direct downloads in the last month)

Chúng tôi dùng hàm log() để làm mượt giá trị số lượt tải, vì mỗi lượt tải tiếp theo có trọng số thấp hơn; chênh lệch giữa 0 và 1000 lượt tải nên có tác động lớn hơn đến điểm phổ biến so với chênh lệch giữa 100.000 và 101.000 lượt tải.

Việc chấm điểm lại này cải thiện mức độ liên quan tổng thể của kết quả tìm kiếm do RDocumentation.org trình bày và nhờ đó, người dùng có thể tập trung vào việc đọc tài liệu thay vì tìm kiếm chúng.

Nếu bạn muốn tìm hiểu thêm về cách triển khai truy vấn Elasticsearch, bạn có thể xem dự án RDocumentation trên GitHub. Bản thân truy vấn nằm trong SearchController.

Nếu bạn muốn tìm hiểu thêm về cách RDocumentation.org được triển khai, hãy xem các repo của chúng tôi:



Giới thiệu về RDocumentation 

RDocumentation tổng hợp tài liệu trợ giúp cho các gói R từ CRAN, BioConductor và GitHub - ba nguồn tài liệu R hiện hành phổ biến nhất. Tuy nhiên, RDocumentation.org không chỉ đơn thuần tổng hợp thông tin này, mà còn đưa toàn bộ tài liệu đến trong tầm tay bạn thông qua gói RDocumentation. Gói RDocumentation ghi đè các hàm trợ giúp cơ bản từ gói utils và cho phép bạn truy cập RDocumentation.org ngay trong IDE RStudio của mình. Tra cứu các gói R mới nhất và phổ biến nhất, tìm kiếm xuyên suốt tài liệu và đăng ví dụ từ cộng đồng.

Chủ đề
R
Liên quan

blog

Claude Opus 4.6: Tính năng, Điểm chuẩn, Bài kiểm tra thực hành và hơn thế nữa

Mô hình mới nhất của Anthropic dẫn đầu ở mã hóa tác tử và lập luận phức tạp. Thêm vào đó, nó có cửa sổ ngữ cảnh 1M.
Matt Crabtree's photo

Matt Crabtree

10 phút

Xem thêm