Trích rút từ khóa tự động với học không giám sát

Trích rút từ khóa là một trong những phương pháp đơn giản nhất giúp cho việc phân tích & khai thác các giá trị từ dữ liệu văn bản. Bài toán trích rút từ khóa (tiếng anh: Keyword Extraction hoặc Keyphare Extraction) là quá trình tự động trích rút ra các từ khóa/ thuật ngữ là các từ/cụm từ tiêu biểu, đại diện cho văn bản.

Ứng dụng của trích rút từ khóa khá phổ biến. Như bạn có thể thấy, mỗi bài báo của các trang tin tức trực tuyến đều có những từ khóa đại diện cho nội dung của bài. Các từ khóa này đại diện cho các chủ đề của bài viết, đóng vai trò kết nối các bài viết liên quan lại với nhau, phân tích sự kiện & xu hướng. Hay một ví dụ khác, các nhà cung cấp quảng cáo trực tuyến có thể trích rút từ khóa của các trang web, từ đó có thể phân cụm người dùng và hiển thị quảng cáo (sản phẩm) phù hợp với đối tượng là người dùng của các trang web đó.

Trong bài viết này, Lập Trình Không Khó sẽ tập trung vào quy trình trích rút từ khóa sử dụng phương pháp học không giám sát (Unsupervised) và sau đó là đi vào chi tiết một số thuật toán học không giám sát cho bài toán trích rút từ khóa này.

Quá trình trích rút từ khóa với học không giám sát

Với bài toán trích rút từ khóa, các thuật toán hoạt động theo 1 quy trình giống như các bước trong hình ảnh dưới đây.Quy trình trích rút từ khóa tự động

  • Văn bản (Document) cần trích rút từ khóa sẽ đi qua bước tiền xử lý (Pre-processing) để chuẩn hóa cũng như loại bỏ các thông tin gây nhiễu hoặc có rất ít giá trị cho việc trích rút từ khóa. Chẳng hạn như xóa bỏ các mã HTML, loại bỏ các stopword, dấu câu,…
  • Từ văn bản đã tiền xử lý, ta sẽ tìm cách lấy ra các ứng viên (Candidate) có khả năng là từ khóa (từ hoặc cụm từ) đại diện cho văn bản.
  • Mỗi từ khóa ứng viên sẽ được đánh giá bằng thuật toán và được gán một điểm số nhất định. Các từ khóa có điểm số cao nhất sẽ được lựa chọn.
  • Các từ khóa tiềm năng sẽ qua bước hậu xử lý (Post-processing). Bước này sẽ giúp ta sàng lọc một lần nữa, chẳng hạn như loại bỏ các từ khóa gần giống nhau, có cùng ý nghĩa.
  • Cuối cùng, ta sẽ có bảng xếp hạng các từ khóa ứng viên đó và chúng ta sẽ lấy ra top N từ khóa làm kết quả cuối cùng.

Các thuật toán trích rút từ khóa

Ưu điểm của học không giám sát là không cần dữ liệu có gán nhãn, không cần huấn luyện mô hình trước khi sử dụng. Đặc trưng của các phương pháp trích rút từ khóa theo hướng học không giám sát là dựa trên thống kê từ chính văn bản đầu vào. Hầu hết các thuật toán này không yêu cầu các đặc trưng ngôn ngữ nào và có thể áp dụng cho các ngôn ngữ khác nhau (tiếng Anh, tiếng Việt,…).

Mục này sẽ đi qua lần lượt từng thuật toán trích rút từ khóa thuộc phương pháp học không giám sát. Bắt đầu bằng các thuật toán đơn giản và tăng dần độ phức tạp.

Phương pháp đếm tần suất

Phương pháp này hết sức đơn giản, chỉ việc đếm số lần xuất hiện của từng từ trong văn bản. Chúng ta sẽ đi vào ví dụ với 1 văn bản tiếng Việt luôn:

Trích rút từ khóa tự động với học không giám sát 1

B1. Tiền xử lý (Pre-processing)

Trong bước này, chúng ta sẽ thực hiện một số thao tác bao gồm: tách từ tiếng Việt, đưa về dạng viết thường, xóa dấu câu, stopword.

Trích rút từ khóa tự động với học không giám sát 2

B2. Liệt kê các ứng viên

Bằng cách tách văn bản đã xử lý ở trên theo khoảng trắng. Cách làm này giúp ta thu được các từ và mỗi từ này sẽ là 1 ứng viên có thể là từ khóa đại diện cho văn bản.

B3. Chấm điểm các ứng viên

Chúng ta sẽ đếm tần suất xuất hiện của mỗi ứng viên trong văn bản đã xử lý. Và giá trị này sẽ là điểm của chúng luôn.

B4. Kết quả cuối cùng

Từ kết quả chấm điểm ở trên, ta thực hiện sắp xếp theo thứ tự giảm dần để lấy ra top N từ khóa có số lần xuất hiện nhiều nhất làm kết quả.

Hạn chế của phương pháp

Phương pháp này chỉ đơn giản là đếm tần suất xuất hiện của các ứng viên. Bạn có thể dễ dàng nhận ra yếu điểm của nó. Bởi lẽ các từ xuất hiện nhiều không phải lúc nào cũng là từ khóa, điển hình là các từ mà chúng ta coi nó là stopword (nếu, thì, là, mà, và, …). Do đó, chúng ta cần những phương pháp tìm ra các ứng viên một cách tốt hơn!

TF-IDF (Term Frequency – Inverse Document Frequency)

Phương pháp này ngoài việc quan tâm yếu tố tần suất 1 từ xuất hiện trong một văn bản thì nó còn quan tâm tới tỉ lệ từ đó xuất hiện trong tất cả các văn bản. Chúng ta cùng tìm hiểu nó qua các bước của quy trình trích rút từ khóa.

Bởi vì IDF quan tâm tới tỉ lệ xuất hiện của từ xuyên suốt toàn bộ các văn bản. Do đó, phương pháp này không chỉ dựa trên 1 văn bản đơn lẻ mà thống kê dựa trên 1 tập hơn các văn bản.

B1. Tiền xử lý dữ liệu

Cũng giống như phương pháp trên, chúng ta vẫn sẽ tách từ, đưa về chữ thường, xóa bỏ dấu câu và stopword của các văn bản.

B2. Liệt kê các ứng viên

Chúng ta có thể sinh ra các từ khóa ứng viên bằng cách tách từ theo khoảng trắng. Khi đó ta sẽ được các từ đơn (1-gram). Ngoài ra, bạn có thể ghép 2 từ liên tiếp để tạo ra cụm từ 2-gram, 3 từ liên tiếp để tạo ra 3-gram,… Và đó sẽ là các ứng cử viên từ khóa.

B3. Chấm điểm các từ khóa

Với mỗi ứng viên (từ khóa) có được, chúng ta thực hiện tính TF và IDF của ứng viên đó. Tích của TF và IDF sẽ là điểm số của từ khóa đó.

Chi tiết về TF-IDF và ví dụ, bạn có thể xem chi tiết tại bài viết này.

B4. Kết quả cuối

Từ bảng chấm điểm của các ứng viên, ta sắp xếp theo thứ tự điểm giảm dần và lấy ra N từ khóa đầu tiên làm kết quả cuối cùng.

Rapid Automatic Keyword Extraction (RAKE)

RAKE là một phương pháp trích xuất từ khóa được đề xuất vào năm 2010. Phương pháp này sử dụng tần suất từ và đồng xuất hiện để xác định các từ khóa. Phương pháp này rất hữu hiệu trong việc xác định các từ khóa là cụm từ.

Chúng ta cùng đi vào ví dụ cụ thể xem RAKE hoạt động như thế nào.

Trích rút từ khóa tự động với học không giám sát 3

B1. Tiền xử lý dữ liệu

Các stopword (tiếng Việt) sẽ bị xóa khỏi văn bản. Và do tiếng Việt có từ ghép nên ta nên tách từ trước.

Trích rút từ khóa tự động với học không giám sát 4

B2. Liệt kê ứng viên

Chúng ta sẽ tách văn bản dựa trên vị trí của các stopword và dấu câu và thu được các từ & cụm từ. Các từ và cụm từ đứng cạnh nhau không bị chia tách bởi dấu câu và stopword sẽ được coi là các ứng viên.

Trích rút từ khóa tự động với học không giám sát 5

Khi đó, các cụm từ “blog cá_nhân” được coi là 1 từ khóa đơn (single keyword).

B3. Chấm điểm ứng viên

Đầu tiên, ta sẽ đi đếm tần suất xuất hiện của tất cả các từ đơn trong danh sách các từ khóa ứng viên.

lập_trình khó blog cá_nhân nguyễn_văn_hiếu
Word Frequency: freq(w) 1 1 1 1 1

Tiếp theo, các từ đồng xuất hiện cũng sẽ được thống kê và bậc (degree) cho mỗi từ là tổng của chúng (Xem bảng để hiểu hơn). Số liệu này xác định các từ xuất hiện thường xuyên trong các từ khóa ứng viên dài.

lập_trình khó blog cá_nhân nguyễn_văn_hiếu
lập_trình 1 0 0 0 0
khó 0 1 0 0 0
blog 0 0 1 1 0
cá_nhân 0 0 1 1 0
nguyễn_văn_hiếu 0 0 0 0 1
degree: deg(w) 1 1 1 + 1 = 2 1 + 1 = 2 1

Tiếp nữa, ta thực hiện chia deg(w) cho freq(w) để có được điểm số cuối cùng cho các từ đơn. Việc này giúp ta thấy được từ nào xuất hiện nhiều hơn trong cụm so với đứng riêng lẻ.

lập_trình khó blog cá_nhân nguyễn_văn_hiếu
Score = \frac{deg(w)}{freq(w)} 1 / 1 = 1 1 / 1 = 1 2 / 1 = 2 2 / 1 = 2 1 / 1 = 1

B4. Xếp hạng cuối cùng

Cuối cùng, ta có được điểm của các từ khóa ứng viên bằng tổng điểm của các thành viên của nó. Sau đó, top N các ứng viên có điểm số cao sẽ được coi là các từ khóa của bài viết.

Từ khóa Điểm số Chi tiết
blog cá_nhân 4 score(blog) + score(cá_nhân) = 2 + 2 = 4
lập_trình 1 score(lập_trình) = 1
cá_nhân 1 score(cá_nhân) = 1
nguyễn_văn_hiếu 1 score(nguyễn_văn_hiếu) = 1
khó 1 score(khó) = 1

Như bảng điểm số cuối cùng trên, ta có thể ưu tiên các từ ghép lên trước từ đơn dù chúng có cùng điểm số. Bởi vì các từ ghép thường mang ý nghĩa và có khả năng là từ khóa cao hơn.

Hạn chế của RAKE

  • Danh sách stopword đóng vai trò quan trọng. Nếu danh sách này không đủ, nó có thể tạo ra các ứng viên từ khóa rất rất dài.
  • Từ khóa nhiều chữ có thể bị bỏ sót nếu có 1 chữ trong nó nằm trong danh sách stopword. Ví dụ như từ “Lập Trình Không Khó” trong ví dụ trên bị mất đi do chữ “không” nằm trong stopword.

Sử dụng RAKE với Python

Chúng ta có thể sử dụng thư viện dưới đây để thực thi RAKE trên Python.

Kết quả sau khi chạy ta thu được:

Yet Another Keyword Extractor (YAKE)

YAKE là một thuật toán trích rút từ khóa phổ biến khác được đề xuất vào năm 2018. Nó hoạt động tốt hơn TF-IDF và RAKE trên nhiều bộ dữ liệu và giành giải thưởng “short paper” tốt nhất tại ECIR 2018.

YAKE sử dụng các đặc trưng về thống kê để xác định các từ khóa quan trọng nhất. Nó không sử dụng bất cứ thông tin ngôn ngữ học nào (như NER hay POS Tagging), do đó YAKE có thể dùng cho mọi ngôn ngữ khác nhau. Nó chỉ cần tới danh sách stopword thôi. Đọc đến đây thấy giống RAKE quá, để xem có gì mà nó tốt hơn nào.

B1+B2. Tiền xử lý & tạo các ứng viên

Với dữ liệu tiếng Việt, trước tiên ta vẫn thực hiện tách từ để xác định các từ ghép.

Tiếp đó, ta sẽ tách văn bản bởi khoảng trắng và các ký tự đặc biệt (dấu câu, ngoặc, …).

Ta sẽ quyết định xem từ khóa có độ dài tối đa bao nhiêu từ. Chẳng hạn bạn chỉ chấp nhận các ứng viên có số từ tối đa là 3, khi đó ta sẽ có các ứng viên 1-gram, 2-gram và 3-gram bằng cách sử dụng cửa sổ trượt.

Tuy nhiên, ta không lấy tất cả các ứng viên này. Các ứng viên từ khóa mà từ bắt đầu hoặc kết thúc của nó có trong danh sách stopword sẽ bị loại bỏ.

B3. Chấm điểm các ứng viên

YAKE sử dụng 5 thước đo (đặc trưng) khác nhau để đánh giá mức độ quan trọng của các từ khóa ứng viên.

1. Yếu tố viết hoa/thường

Thước đo này xem xét yếu tố viết hoa (title case, upper case) của từ. Các từ viết hoa chữ cái đầu hoặc từ viết tắt (Ex: ASEAN) thường đóng vai trò quan trọng hơn.

Để đánh giá yếu tố này, chúng ta sẽ đếm số lần xuất hiện của từ w được viết hoa chữ cái đầu (bỏ qua nếu nó đứng đầu câu). Đồng thời, ta cũng đếm số lần xuất hiện của từ w này ở trạng thái viết hoa toàn bộ (upper case).

Sau đó, ta lấy giá trị lớn hơn hơn của 2 kết quả đếm và normalize kết quả bằng cách chia cho log của tổng số lần xuất hiện (không phân biệt hoa thường).

casing(w) = \frac{max( count(w\ is\ capital), count(w\ is\ acronym) )}{1 + log(count(w))}
2. Vị trí của từ

Vị trí của từ trong văn bản cũng là một yếu tố đánh giá mức độ quan trọng của nó trong văn bản. Điều này dựa trên thực tế là phần đầu của văn bản thường khái quát nội dung toàn bài và chứa những từ khóa quan trọng. Do đó, nếu 1 ứng cử viên xuất hiện ở phần đầu của bài viết thì khả năng nó là từ khóa sẽ cao hơn.

Đầu tiên, chúng ta sẽ lấy ra vị trí của tất cả các câu (sentence) có chứa từ w.

Sen(w) = \text{Vị trí của các câu có chứa từ } w

Tiếp theo, ta sẽ tính toán đặc trưng vị trí của từ bằng cách lấy vị trí trung vị (median) của nó và áp dụng vào công thức dưới đây:

position(w) = log(log(3 + Median(Sen(w))))
3. Tần suất của từ

Tần suất của các từ được tính và chuẩn hóa bởi 1-standard deviation so với giá trị trung bình (mean)

frequency(w) = \frac{count\ of\ word\ w}{mean(counts) + standard\ deviation(counts)}
4. Ngữ cảnh của từ

Đặc trưng ngữ cảnh của từ (word relatedless) giúp xác định mức độ liên quan của một từ với ngữ cảnh của nó. Ta sẽ đếm xem có bao nhiều từ khác nhau đứng bên cạnh (đằng trước, đằng sau) của mỗi từ. Nếu có 1 từ nào đó thường xuyên đứng cạnh nhiều từ khóa khác nhau thì có thể nó là một stopword.

relatedness(w) = 1 + (WR + WL) * \frac{count(w)}{max\ count} + PL + PR

Trong đó,

  • WR = (Số lượng từ khác nhau ở bên phải) / (tổng số từ xuất hiện bên phải),
  • WL = (Số lượng từ khác nhau ở bên trái) / (tổng số từ xuất hiện bên trái),
  • PL = (Tổng số từ bên trái) / (max count)
  • PR = (Tổng số từ bên phải) / (max count)
5. Từ trong các câu khác nhau

Đặc trưng này xác định tần suất một từ xuất hiện ở trong các câu (sentence) khác nhau. Một từ xuất hiện trong nhiều câu khác nhau thì sẽ có điểm cao hơn.

different(w) = \frac{number\ of\ sentences\ w\ occurs\ in}{total\ sentences}
Điểm số cuối cùng

5 đặc trưng trên được kết hợp lại theo công thức dưới đây để cho ra điểm số cuối cùng của mỗi từ:

score(w) = \frac{d * b}{a + (c / d) + (e / d)}

Trong đó,

  • a = casing, b = position, c = frequency, d = relatedness, e = different
Điểm số của ứng viên từ khóa

Với mỗi từ khóa ứng viên, điểm số của chúng sẽ được tính dựa theo công thức dưới đây:

S(keyword) = \frac{product(scores\ of\ words\ in\ keyword)}{1 + (sum\ of\ scores\ of\ words) * count(keyword)}

B4. Hậu xử lý

Danh sách các từ khóa ứng viên thu được trong quá trình trích rút từ khóa thường tồn tại các cặp tương tự nhau. Chẳng hạn như các biến thể sau:

  • “work” và “works”
  • “relevant” và “relevance”
  • Từ đồng nghĩa: “an phận” và “yên phận”

Để xử lý những trùng lặp không mong muốn này, chúng ta sẽ áp dụng quy trình sau:

  1. Danh sách từ khóa ứng viên sẽ được sắp xếp tăng dần theo điểm số ta đã tính ở trên.
  2. Với mỗi từ khóa trong danh sách đã sắp xếp:
    1. Nếu từ khóa hiện tại có khoảng cách Levenshtein đủ nhỏ với bất kỳ một từ khóa nào ta đã sàng lọc thì bỏ qua.
    2. Nếu từ khóa hiện tại là 1 từ đồng nghĩa với 1 từ khóa mà ta đã sàng lọc thì bỏ qua. Tham khảo danh sách từ đồng nghĩa tiếng Việt tại đây.
    3. Nếu không thuộc 2 trường hợp trên thì thêm từ khóa vào danh sách sàng lọc.

Sau cùng, danh sách sàng lọc sẽ là danh sách các từ khóa đã loại bỏ trùng lặp.

B5. Xếp hạng cuối cùng

Cuối cùng, ta thu danh sách từ khóa cùng với điểm số của chúng. Với YAKE, từ khóa quan trọng sẽ có điểm số thấp hơn. Do đó, ta có thể sắp xếp dựa theo điểm số tăng dần và lấy ra top N từ khóa là kết quả cuối cùng.

Sử dụng YAKE trong Python

Đầu tiên, bạn hãy cài đặt thư viện yake trong Python thông qua pip:

Và dưới đây là ví dụ minh họa cho việc trích rút từ khóa của 1 văn bản sử dụng YAKE,

Tài liệu tham khảo

Bài viết liên quan:

Sáng lập cộng đồng Lập Trình Không Khó với mong muốn giúp đỡ các bạn trẻ trên con đường trở thành những lập trình viên tương lai. Tất cả những gì tôi viết ra đây chỉ đơn giản là sở thích ghi lại các kiến thức mà tôi tích lũy được.
Subscribe
Notify of
guest
0 Bình luận
Inline Feedbacks
View all comments