Tôi chắc chắn có một bài đăng trên trang này, nhưng tôi không thể tìm thấy bài đăng hỏi câu hỏi chính xác này. Hãy xem xét những điều sau đây:Thuật toán dự đoán từ
- Chúng tôi có một cuốn từ điển chữ có sẵn
- Chúng tôi đang ăn nhiều đoạn văn từ, và tôi muốn để có thể dự đoán từ kế tiếp trong một câu cho đầu vào này.
Giả sử chúng tôi có một vài câu như "Xin chào tôi tên là Tom", "Tên anh ấy là jerry", "Anh ta đi đâu không có nước". Chúng tôi kiểm tra bảng băm nếu một từ tồn tại. Nếu không, chúng tôi gán cho nó một id duy nhất và đặt nó vào bảng băm. Bằng cách này, thay vì lưu trữ một "chuỗi" các từ như một chuỗi các chuỗi, chúng ta chỉ có thể có một danh sách các uniqueID.
Ở trên, chúng tôi sẽ có ví dụ (0, 1, 2, 3, 4), (5, 2, 3, 6) và (7, 8, 9, 10, 3, 11, 12). Lưu ý rằng 3 là "is" và chúng tôi đã thêm id duy nhất mới khi chúng tôi phát hiện từ mới. Vì vậy, nói rằng chúng tôi được đưa ra một câu "tên cô ấy", đây sẽ là (13, 2, 3). Chúng ta muốn biết, với bối cảnh này, từ tiếp theo sẽ là gì. Đây là thuật toán tôi nghĩ đến, nhưng tôi không nghĩ rằng thuật toán của nó hiệu quả:
- Chúng tôi có một danh sách các chuỗi N (câu được quan sát). 3,6,2,7,8.
- Mỗi chuỗi có kích thước trung bình M, trong đó M là chiều dài câu trung bình
- Chúng tôi được cung cấp một chuỗi mới có kích thước S, ví dụ. 13, 2, 3 và chúng tôi muốn biết từ tiếp theo có thể xảy ra nhất là gì?
Thuật toán:
Đầu tiên quét toàn bộ danh sách các chuỗi đối với những người có chỉ số S đầu vào đầy đủ (13,2,3, trong ví dụ này). Vì chúng ta phải quét các chuỗi N, mỗi chiều dài M, và so sánh các chữ S tại một thời điểm, O của nó (N * M * S).
Nếu không có chuỗi nào trong quá trình quét của chúng tôi có S đầy đủ, lần quét tiếp theo bằng cách xóa từ ít quan trọng nhất (ví dụ: từ đầu tiên, vì vậy hãy xóa 13). Bây giờ, quét cho (2,3) như trong 1 trong trường hợp xấu nhất O (N * M * S) mà thực sự là S-1.
Tiếp tục quét theo cách này cho đến khi chúng tôi nhận được kết quả> 0 (nếu có).
Kiểm đếm các từ tiếp theo trong tất cả các chuỗi còn lại mà chúng tôi đã thu thập được. Chúng tôi có thể sử dụng bảng băm đếm mỗi lần chúng tôi thêm và theo dõi từ được thêm nhiều nhất. O (N) trường hợp xấu nhất xây dựng, O (1) để tìm từ tối đa.
- Từ tối đa được tìm thấy là có nhiều khả năng nhất, vì vậy hãy trả lại từ đó.
Mỗi lần quét mất trường hợp xấu nhất O (M * N * S). Điều này là do có N chuỗi, mỗi chuỗi có các số M và chúng tôi phải kiểm tra các số S để phủ một kết quả phù hợp. Chúng tôi quét S lần trường hợp xấu nhất (13,2,3, sau đó 2,3, sau đó 3 cho 3 lần quét = S). Như vậy, tổng độ phức tạp là O (S^2 * M * N).
Vì vậy, nếu chúng tôi có 100.000 chuỗi và độ dài câu trung bình là 10 từ, chúng tôi đang xem xét 1.000.000 * S^2 để có được từ tối ưu. Rõ ràng, N >> M, vì chiều dài câu không quy mô với số câu được quan sát nói chung, vì vậy M có thể là một hằng số. Sau đó chúng ta có thể giảm độ phức tạp xuống O (S^2 * N). O (S^2 * M * N) có thể hữu ích hơn khi phân tích, vì M có thể là một "hằng số" khá lớn.
Đây có thể là cách tiếp cận hoàn toàn sai lầm đối với loại vấn đề này, nhưng tôi muốn chia sẻ suy nghĩ của mình thay vì chỉ yêu cầu blatantly yêu cầu bảo lãnh. Lý do im quét theo cách tôi làm là vì tôi chỉ muốn quét nhiều như tôi phải làm. Nếu không có S đầy đủ, chỉ cần tiếp tục cắt tỉa S cho đến khi một số chuỗi khớp với nhau. Nếu họ không bao giờ phù hợp, chúng tôi không có ý tưởng gì để dự đoán như là từ tiếp theo! Bất kỳ đề xuất về một giải pháp phức tạp ít thời gian/không gian? Cảm ơn!
gì nói đến cái tâm sau khi đọc câu hỏi của bạn là một từ mảng hậu tố dựa trên cụm từ/đoạn văn. Xem http://projectile.sv.cmu.edu/research/public/tools/salm/tutorial.pdf ví dụ – hatchet
Tôi không có giải pháp trực tiếp cho bạn nhưng có một số cách đọc tuyệt vời tại đây: http: // vi .wikipedia.org/wiki/N-gram http://www.codeproject.com/Articles/20423/N-gram-and-Fast-Pattern-Extraction-Algorithm http://aclweb.org/anthology-new/Q /Q13/Q13-1010.pdf –