Tùy thuộc vào trường hợp, bạn có thể quan tâm đến việc sử dụng một trong các phương pháp sau:
Phương pháp 0: Sử dụng API hoặc thư viện
Thông thường, có một số vấn đề với các thư viện này vì một số trong số chúng không chính xác đối với văn bản nhỏ, một số ngôn ngữ bị thiếu, chậm, yêu cầu kết nối internet, không miễn phí, ... Nhưng nói chung, chúng sẽ phù hợp với hầu hết các nhu cầu .
Phương pháp 1: Mô hình ngôn ngữ
Một mô hình ngôn ngữ cho chúng ta xác suất của một chuỗi các từ. Điều này rất quan trọng vì nó cho phép chúng tôi phát hiện mạnh mẽ ngôn ngữ của văn bản, ngay cả khi văn bản có chứa các từ ở các ngôn ngữ khác (ví dụ: "'Hola' có nghĩa là 'xin chào' trong tiếng Tây Ban Nha" ).
Bạn có thể sử dụng N mô hình ngôn ngữ (một mô hình cho mỗi ngôn ngữ), để cho điểm văn bản của bạn. Ngôn ngữ được phát hiện sẽ là ngôn ngữ của mô hình đã cho bạn điểm cao nhất.
Nếu bạn muốn xây dựng một mô hình ngôn ngữ đơn giản cho điều này, tôi sẽ chọn 1 gam. Để làm điều này, bạn chỉ cần đếm số lần mỗi từ trong một văn bản lớn (ví dụ: Wikipedia Corpus bằng ngôn ngữ "X") đã xuất hiện.
Sau đó, xác suất của một từ sẽ là tần số của nó chia cho tổng số từ được phân tích (tổng của tất cả các tần số).
the 23135851162
of 13151942776
and 12997637966
to 12136980858
a 9081174698
in 8469404971
for 5933321709
...
=> P("'Hola' means 'hello' in spanish") = P("hola") * P("means") * P("hello") * P("in") * P("spanish")
Nếu văn bản cần phát hiện khá lớn, tôi khuyên bạn nên lấy mẫu N từ ngẫu nhiên và sau đó sử dụng tổng logarit thay vì phép nhân để tránh các vấn đề về độ chính xác dấu phẩy động.
P(s) = 0.03 * 0.01 * 0.014 = 0.0000042
P(s) = log10(0.03) + log10(0.01) + log10(0.014) = -5.376
Phương pháp 2: Các tập hợp giao nhau
Một cách tiếp cận đơn giản hơn nữa là chuẩn bị N bộ (một bộ cho mỗi ngôn ngữ) với M từ thường xuyên nhất. Sau đó, giao văn bản của bạn với mỗi bộ. Nhóm có số lượng giao lộ cao nhất sẽ là ngôn ngữ được phát hiện của bạn.
spanish_set = {"de", "hola", "la", "casa",...}
english_set = {"of", "hello", "the", "house",...}
czech_set = {"z", "ahoj", "závěrky", "dům",...}
...
text_set = {"hola", "means", "hello", "in", "spanish"}
spanish_votes = text_set.intersection(spanish_set)
english_votes = text_set.intersection(english_set)
czech_votes = text_set.intersection(czech_set)
...
Phương pháp 3: Nén zip
Điều này gây tò mò hơn bất cứ điều gì khác, nhưng đây là ... Bạn có thể nén văn bản của mình (ví dụ LZ77) và sau đó đo khoảng cách zip liên quan đến văn bản nén tham chiếu (ngôn ngữ đích). Cá nhân tôi không thích nó vì nó chậm hơn, kém chính xác và ít mô tả hơn các phương pháp khác. Tuy nhiên, có thể có những ứng dụng thú vị cho phương pháp này. Để đọc thêm: Cây Ngôn ngữ và Khai báo