HocThuatSo.comHọc Thuật Số
Gửi thư
Cơ sở dữ liệu học thuật mở

Gọi API OpenAlex bằng vài dòng lệnh: lọc theo cơ quan, chủ đề, năm

Cách gọi API OpenAlex bằng Python: cấu trúc thực thể, cú pháp bộ lọc theo cơ quan, chủ đề, năm, phân trang bằng con trỏ, khoá API, và lưu toàn bộ bài của một trường thành bảng.

Gọi API OpenAlex bằng vài dòng lệnh: lọc theo cơ quan, chủ đề, năm

Gọi API OpenAlex rất gọn: gửi yêu cầu tới điểm cuối /works kèm tham số filter như authorships.institutions.ror, publication_year, primary_topic.id, lặp qua các trang bằng cursor, rồi ghi các trường cần dùng thành bảng. Khoảng hai mươi dòng Python là đủ.

OpenAlex là chỉ mục mở do tổ chức phi lợi nhuận OurResearch vận hành, dữ liệu phát hành theo giấy phép CC0. Giao diện web tiện để tra vài bài, nhưng muốn lấy toàn bộ công bố của một trường, theo dõi một chủ đề qua nhiều năm hay ghép với dữ liệu nội bộ, API là con đường đúng. Bài này đi từ cấu trúc dữ liệu tới một đoạn mã chạy được.

OpenAlex tổ chức dữ liệu thành những thực thể nào?

Mỗi loại thực thể có một điểm cuối riêng và một tiền tố mã. Biết thực thể nào chứa gì giúp bạn chọn đúng điểm cuối và đúng bộ lọc.

Thực thểĐiểm cuốiTiền tố mãChứa gì
Công trình/worksWBài báo, sách, chương, bộ dữ liệu, luận án, tiền ấn phẩm
Tác giả/authorsAHồ sơ tác giả đã được phân định
Nguồn/sourcesSTạp chí, kho lưu trữ, hội nghị
Cơ quan/institutionsITrường, viện, gắn với mã ROR
Chủ đề/topicsTHệ chủ đề phân cấp: lĩnh vực, ngành, chủ đề con
Nhà xuất bản/publishersPNhà xuất bản và quan hệ công ty mẹ con
Nhà tài trợ/fundersFTổ chức tài trợ nghiên cứu

Mỗi thực thể cũng nhận định danh ngoài: công trình nhận DOI, tác giả nhận ORCID, cơ quan nhận ROR, nguồn nhận ISSN. Ví dụ /works/doi:10.xxxx/yyyy trả về đúng bài có DOI đó. Hệ khái niệm cũ (concepts) đang được thay bằng hệ chủ đề; với dự án mới, nên dùng topics.

Chuẩn bị: khoá API và thư viện

Khoá API

OpenAlex đã chuyển sang dùng khoá API miễn phí: tạo tài khoản trên trang OpenAlex, lấy khoá trong phần cài đặt, rồi gửi kèm mỗi yêu cầu qua tham số api_key. Hạn mức theo ngày và tốc độ tối đa mỗi giây được ghi trong mục giới hạn của tài liệu chính thức; vượt hạn mức sẽ nhận mã lỗi 429. Đọc mục đó trước khi chạy lấy dữ liệu lớn, vì cách tính hạn mức đã thay đổi vài lần.

Thư viện

Python với gói requests là đủ. Có gói cộng đồng pyalex bọc sẵn API, và trên R có gói openalexR của rOpenSci. Dùng gói thì nhanh hơn, tự gọi bằng requests thì hiểu rõ từng tham số; bài này đi theo cách thứ hai để thấy cơ chế.

Cú pháp bộ lọc: lọc theo cơ quan, chủ đề, năm

Tìm mã của cơ quan

Gọi /institutions với tham số search là tên trường bằng tiếng Anh. Kết quả trả về mã OpenAlex dạng I… và mã ROR. Đọc kỹ trường display_name, country_code và số công trình để chắc đúng trường, vì nhiều trường có tên gần giống nhau.

Ghép bộ lọc

Tham số filter nhận nhiều điều kiện cách nhau bằng dấu phẩy, mỗi điều kiện dạng trường:giá trị. Dấu phẩy nghĩa là và. Ví dụ authorships.institutions.id:I123,publication_year:2019-2024,type:article lấy bài báo của cơ quan có mã I123 trong giai đoạn 2019 đến 2024. Dấu gạch đứng | trong cùng một trường nghĩa là hoặc, dấu chấm than ! nghĩa là phủ định.

Lọc theo chủ đề

Lấy mã chủ đề từ /topics rồi lọc bằng primary_topic.id hoặc topics.id. Muốn lọc rộng hơn theo ngành hay lĩnh vực, dùng primary_topic.field.id hoặc primary_topic.subfield.id. Nếu chỉ có từ khoá, dùng search hoặc title_and_abstract.search, nhớ rằng tìm từ khoá kém chính xác hơn lọc theo mã.

Đoạn mã lấy toàn bộ bài của một trường

Phân trang thường bằng tham số page chỉ đi được tới khoảng 10.000 kết quả đầu. Để lấy hết, dùng phân trang bằng con trỏ: gửi cursor=* ở lần đầu, mỗi lần sau lấy next_cursor trong phần meta của kết quả trước, dừng khi giá trị này rỗng. Đoạn mã theo đúng logic đó:

  1. import requests, csv, time; đặt GOC là địa chỉ máy chủ API ghi trong tài liệu OpenAlex và KHOA là khoá API của bạn.
  2. tham = {'filter': 'authorships.institutions.ror:MÃ_ROR,publication_year:2019-2024', 'per_page': 200, 'cursor': '*', 'api_key': KHOA, 'select': 'id,doi,title,publication_year,type,cited_by_count,primary_location'}
  3. dong = [], rồi vòng lặp while tham['cursor']: gọi r = requests.get(GOC + '/works', params=tham, timeout=60).json().
  4. Trong vòng lặp: dong += r['results'], rồi tham['cursor'] = r['meta']['next_cursor'], và time.sleep(0.2) để giữ nhịp gọi vừa phải.
  5. Sau vòng lặp, ghi ra CSV bằng csv.DictWriter, chỉ giữ các cột phẳng như id, doi, title, publication_year, cited_by_count; tên tạp chí lấy từ primary_location, source, display_name nếu có.
  6. So số dòng ghi được với r['meta']['count'] của lần gọi đầu. Hai số phải khớp.

Tham số per_page tối đa 200, tham số select cắt bớt trường trả về để mỗi lần gọi nhẹ hơn. Lọc theo ROR tiện khi so với hệ thống khác dùng ROR; lọc theo mã I… cho kết quả tương đương trong OpenAlex.

Đọc kết quả: những chỗ dễ hiểu sai

Tóm tắt không trả về dạng văn bản liền. Trường abstract_inverted_index lưu mỗi từ kèm vị trí. Muốn có văn bản, phải xếp lại từ theo vị trí. Nhiều bài không có trường này.

Cơ quan được gán bằng thuật toán. OpenAlex đối chiếu chuỗi địa chỉ với ROR. Bài có địa chỉ viết lệch có thể không gán vào trường, giống vấn đề mã cơ quan ở các cơ sở thương mại.

Số trích dẫn khác Scopus và Google Scholar. Mỗi nguồn có tập bài trích dẫn khác nhau. Đừng trộn số trích dẫn từ nhiều nguồn trong cùng một bảng.

Loại tài liệu có thể khác cách bạn hiểu. Trường type dùng hệ phân loại riêng của OpenAlex. Kiểm các giá trị thực có trong dữ liệu trước khi lọc.

Dữ liệu cập nhật liên tục. Chạy lại cùng đoạn mã sau một tháng sẽ cho số khác. Ghi ngày chạy và lưu tệp kết quả gốc.

Lấy số liệu tổng hợp mà không cần tải từng bài

Khi chỉ cần đếm, như số bài theo năm hay theo tạp chí, dùng tham số group_by thay vì tải toàn bộ bản ghi:

  • group_by=publication_year trả số bài theo năm cho tập đã lọc.
  • group_by=primary_location.source.id trả số bài theo nguồn.
  • group_by=open_access.oa_status trả phân bố theo trạng thái truy cập mở.
  • group_by=authorships.institutions.country_code cho biết hợp tác với những nước nào.

Một lần gọi group_by thay cho hàng trăm lần tải trang, vừa nhanh vừa đỡ tốn hạn mức. Kết quả nhóm cũng là cách kiểm nhanh xem bộ lọc có đúng ý không trước khi tải thật.

Một tình huống thực tế: đối chiếu với danh sách công bố của trường

Phòng khoa học của một trường muốn biết bao nhiêu bài trong báo cáo năm có mặt trên OpenAlex và có gán đúng trường không. Cách làm: lấy toàn bộ bài theo ROR của trường cho khoảng năm cần xét, ghi thành bảng. Song song, gom DOI trong báo cáo nội bộ. Ghép hai bảng theo DOI đã chuẩn hoá về chữ thường.

Ba nhóm hiện ra: có ở cả hai, chỉ có trong báo cáo, chỉ có trên OpenAlex. Nhóm thứ hai cần tra từng DOI qua /works/doi:…: nếu bài có trên OpenAlex nhưng không gán trường, đó là lỗi gán cơ quan; nếu bài không có, có thể DOI chưa đăng ký với Crossref. Nhóm thứ ba thường là bài giảng viên quên khai. Cả ba đều là thông tin có ích, và toàn bộ việc này không tốn đồng nào ngoài thời gian viết vài chục dòng mã.

Câu hỏi thường gặp

API OpenAlex có mất phí không?

Có hạn mức miễn phí khi dùng khoá API cá nhân. Hạn mức theo ngày và gói trả phí cho nhu cầu lớn được ghi trong tài liệu chính thức; đọc mục giới hạn trước khi lấy dữ liệu lớn.

Vì sao vòng lặp page dừng ở khoảng 10.000 kết quả?

Phân trang thường của OpenAlex chỉ đi được tới phần đầu tập kết quả. Muốn lấy hết, dùng phân trang con trỏ: cursor bằng dấu sao ở lần đầu, sau đó lấy next_cursor từ kết quả trước.

Nên lọc theo mã OpenAlex hay mã ROR của trường?

Cả hai đều cho kết quả tương đương trong OpenAlex. Dùng ROR tiện hơn khi bạn cần ghép với hệ thống khác cũng dùng ROR, như dữ liệu Crossref hay kho lưu trữ của trường.

Làm sao lấy tóm tắt bài từ OpenAlex?

Tóm tắt lưu ở dạng chỉ mục đảo, mỗi từ kèm danh sách vị trí. Xếp lại các từ theo vị trí là ra văn bản. Nhiều bài không có tóm tắt vì nguồn không cung cấp.

Dữ liệu OpenAlex có dùng được để đánh giá giảng viên không?

Dùng được làm một nguồn tham khảo, nhưng cần kiểm việc gán tác giả và cơ quan, và nói rõ nguồn khi trình bày. Không nên trộn với số trích dẫn từ nguồn khác.

Cần tư vấn cụ thể cho trường hợp của bạn?

Chúng tôi sẽ liên hệ trong vòng 24 giờ.

Đăng ký tư vấn ngay

Bài viết liên quan

🧭
Bạn đang ở chặng nào của đường học vị?
Nhập chỗ bạn đang đứng và đích bạn nhắm — công cụ trả về số năm, chi phí và việc phải làm từng chặng.
Xem lộ trình của tôi →
Miễn phí, không cần tài khoản. Xem tất cả công cụ

Bạn cần hỗ trợ thêm?

Để lại thông tin, chúng tôi sẽ liên hệ trong 24 giờ.

hoặc
[email protected]