You are on page 1of 6

DỰ ÁN CUỐI KÌ – ESSAY SEARCH

Giới thiệu:

Có nhiều công cụ tìm kiếm hiện nay, ví dụ: Google, Yahoo, Baidu… vv. Trong dự án này, chúng ta cần xây
dựng một công cụ tìm kiếm bài luận đơn giản.

Nguồn dữ liệu:

Đầu vào / Đầu ra:


Đầu vào:

 Một tập tin văn bản (bài luận) trong thư mục được cung cấp (0.txt, 1.txt, ....).
 Một tập tin văn bản cung cấp các truy vấn tìm kiếm.
 Tên tập tin đầu ra.

Với một từ cho trước, mục tiêu của chúng ta là liệt kê các bài luận có tiêu đề hoặc phần tóm tắt chứa từ
đó. Chỉ xem xét các chữ cái, có thể bỏ qua các ký tự đặc biệt hoặc chữ số. Các truy vấn không phân biệt
chữ hoa và chữ thường.
Các mẫu truy vấn:
 Tìm kiếm chính xác: “từ-tìm-kiếm”
Ví dụ: tìm kiếm bài luận với từ graph, nhập vào: "graph"
 Tìm kiếm tiền tố: từ-tìm-kiếm
Ví dụ: tìm kiếm bài luận với tiền tố graph, nhập vào: graph
 Tìm kiếm hậu tố: *từ-tìm-kiếm*
Ví dụ: tìm kiếm bài luận với hậu tố graph, nhập vào: *graph*
 Tìm kiếm Wildcard: <mẫu-tìm-kiếm>
Ví dụ: tìm kiếm bài luận với từ khóa theo mẫu gr*h, nhập vào: <gr*h>. “*” có thể là một hoặc
nhiều ký tự, vì vậy gr*h nên khớp với các từ như graph, growth ...vv.
 Tìm kiếm với toán tử AND: “+”
Ví dụ: tìm kiếm bài luận với từ khóa graph và sparsity, nhập vào: “graph” + “sparsity”
 Tìm kiếm với toán tử OR: “/”
Ví dụ: tìm kiếm bài luận với từ khóa graph hoặc quantum, nhập vào: “graph” / “quantum”
 Tìm kiếm với toán tử loại trừ: “-”
Ví dụ: tìm kiếm bài luận với từ khóa graph nhưng không đi dèm từ deep, nhập vào: “graph” -
“deep”

Tệp đầu vào – tệp chứa các bài luận:

Có một tập tin gồm bài luận .txt, ví dụ: 0.txt, 1.txt, … Những tập tin bài luận txt này sẽ được đặt trong
một thư mục đã cho.

Mỗi tập tin bài luận txt chứa hai phần: Tiêu đề (dòng đầu tiên), Tóm tắt (những câu còn lại).

Có thể có nhiều truy vấn trong một tệp truy vấn và mỗi dòng đại diện cho một truy vấn cần được xử lý.

Toán tử And / Or / Exclude được hiểu theo chiều từ trái sang phải.
Ví dụ: graph + decompositition / quantum = (graph + decompostition) / quantum
Tất cả các truy vấn trong tệp truy vấn đều hợp lệ, nên bạn không cần phải lo lắng trường hợp các truy
vấn không hợp lệ.
Các mẫu truy vấn:

Mẫu 1: reflect
Tìm kiếm các bài luận có chứa tiền tố [reflect], ví dụ: reflect, reflection.

Mẫu 2: “graph” / *composition*


Tập hợp A: Các bài luận có chính xác từ [graph]
Tập hợp B: Các bài luận có hậu tố của từ [compositition]
Kết quả: Hội của A và B

Mẫu 3: “graph” + decompos


Tập hợp A: Các bài luận có chính xác từ [graph]
Tập hợp B: Các bài luận có tiền tố của từ [decompos]
Kết quả: Giao của A và B

Mẫu 4: graph + decomposition / reflection


Tập hợp A: Các bài luận có tiền tố của từ [graph]
Tập hợp B: Các bài luận có tiền tố của từ [decomposition]
Tập hợp C: Các bài luận có tiền tố của từ [reflection]
Biết rằng: A + B / C = (A + B) / C
Tập hợp D: Giao của A và B
Kết quả: Hội của D và C

Mẫu 5: “spiderMan”
Tìm các bài luận có chính xác từ [spiderman]. Lưu ý: các ký tự in hoa và in thường được xét giống nhau

Mẫu 6: <com*on> - “shaped”


Đối với com*on, có thể tìm thấy “comparison”, “common”, “commutation”, “compression”,
“companion”... từ tệp dữ liệu đầu vào
Tập hợp A: Tìm các bài luận có từ trên với mẫu [com*on]
Tập hợp B: Tìm các bài luận có chính xác từ [shaped]
Kết quả: A – B
Đầu ra: Xuất ra một tệp .txt với tên đã cho

Tên tệp đầu ra được cung cấp như là một arguments khi chạy chương trình. Xuất ra tiêu đề của các bài
luận tìm kiếm được vào một tệp đầu ra. Cuối mỗi tiêu đề là một ký tự xuống dòng.
Nếu không tìm thấy -> in ra “Not Found!” (Không cần kèm theo dấu nháy đôi).
Thứ tự đầu ra phải theo thứ tự của các bài luận: (0.txt, 1.txt, .....).

Yêu cầu:
Sử dụng ngôn ngữ C/C++.
Thiết kế cấu trúc dữ liệu riêng để tìm kiếm nhanh hơn.
Tuân theo yêu cầu định dạng đầu vào/đầu ra
Không sử dụng các thư viện dùng để so sánh khớp chuỗi (vd: str.find, …)

Môi trường kiểm thử:


Hệ điều hành: Ubuntu 22.04.2 LTS
CPU: Intel(R) Core(TM) i7-8700K CPU @ 3.70GHz
RAM: 32GB DDR4
Ổ đĩa: 1TB Gen3 SSD
Phiên bản GCC: 11.3.0

Kiểm thử:
Code nên nhận vào ba đối số:

 Đường dẫn của thư mục đầu vào, đường dẫn đến tệp truy vấn, tên tệp đầu ra
 Tên tệp đầu ra phải tuân thủ: Tệp đầu ra cùng với [output_file_name]

Trợ giảng sẽ chạy code theo lệnh: g++ -std=c++17 -O2 -o essay_search ./[student_id].cpp
Nếu code của bạn cần sử dụng thư viện khác dẫn tới không thể biên dịch mã của bạn, hãy gửi lệnh biên
dịch bạn đã sử dụng qua email cho chúng tôi và nêu rõ lý do trong báo cáo.

Trợ giảng sẽ kiểm tra code như sau: ./essay_search [input_folder_path] [query_file_path]
[output_file_name]

Thời gian giới hạn:

 Chương trình chấm dứt sau 4 giây


 Giải thuật brute-force sẽ không được thông qua

Cách tính điểm:

Chúng tôi có một bộ dữ liệu nhỏ (1000 tệp) và một bộ dữ liệu lớn hơn (trên 8000 tệp).

Tìm kiếm chính xác + Tìm kiếm với toán tử And / Or / Exclude (40%)

100% đầu ra truy vấn đúng -> đạt 40 điểm

80%~99% đầu ra truy vấn đúng -> đạt 20 điểm

Dưới 80% đầu ra truy vấn đúng -> đạt 0 điểm

Tìm kiếm Hậu tố / Tiền tố / Toán tử Wildcard Search (25%)

100% đầu ra truy vấn đúng -> đạt 25 điểm

80%~99% đầu ra truy vấn đúng -> đạt 12 điểm

Dưới 80% đầu ra truy vấn đúng -> đạt 0 điểm

Kiểm tra Khả năng mở rộng: thử nghiệm với nhiều bài luận và truy vấn hơn (10%)

Bạn sẽ nhận được điểm này khi tất cả các câu trả lời đều đúng

Chúng tôi chỉ sẽ kiểm tra mã của bạn nếu bạn vượt qua hai kiểm tra trước

Kiểm tra Tốc độ: cạnh tranh tốc độ với các bạn cùng lơp (15%)

Chúng tôi chỉ sẽ kiểm tra mã của bạn nếu bạn đạt được tất cả các điểm trong ba kiểm tra trên (75 điểm)

10% cuối cùng: 3 điểm

Top 50% - Top 90%: 5 điểm

Top 20% - Top 50%: 10 điểm

Top 20%: 15 điểm

Báo cáo (10%)

Các tập tin được cung cấp:

 main.cpp: trình phân tích txt và một số gợi ý


 query.txt / output.txt: đầu vào / đầu ra mẫu
 query_more.txt / query_more_output.txt: đầu ra mẫu mở rộng
 data: thư mục dữ liệu mẫu cho các bài luận
 data-more: thêm dữ liệu bài luận để tự kiểm thử (1000 tệp)

Chúng tôi sẽ cung cấp một số code trong tệp main.cpp. Bạn có thể sử dụng mã này cho việc triển khai
chương trình.

Các chức năng được cung cấp:

 Lưu trữ biến cho đối số argv


 Xử lý tiêu đề và nội dung bài luận, lưu trữ vào hai vector<string>
 Hàm tiện ích cho việc phân tích và tách chuỗi

Ghi chú:

 Được phép sử dụng STL


 Nhưng đừng sử dụng bất kỳ hàm thư viện so khớp chuỗi nào

Nguồn tham khảo:

Làm thế nào để xây dựng cấu trúc dữ liệu hỗ trợ tìm kiếm một cách hiệu quả?

Dưới đây là một số cấu trúc thông thường mà chúng ta có thể tham khảo:

Trie (Trợ giảng đã triển khai theo hướng này)

tham khảo: https://www.geeksforgeeks.org/trie-insert-and-search

tham khảo: https://www.hackerearth.com/practice/data-structures/advanced-data-structures/trie-


keyword-tree/tutorial/

Suffix-Tree

tham khảo: https://blog.csdn.net/fjsd155/article/details/80211145

tham khảo: https://www.geeksforgeeks.org/ukkonens-suffix-tree-construction-part-1/

Ternary Search Tree

tham khảo: https://www.geeksforgeeks.org/ternary-search-tree/

tham khảo: https://www.cs.upc.edu/~ps/downloads/tst/tst.html

Compressed Trie

tham khảo: https://www.geeksforgeeks.org/compressed-tries/

You might also like