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.
- 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:
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.
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.
{'thiếu_nhi', 'thực_hành', 'trực_tuyến', 'lập_trình', 'miễn_phí', 'website', 'truy_cập', 'https://luyencode.net', 'luyện_code', 'bài', 'code', '300'}
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.
{'luyện_code': 2, 'website': 1, 'thực_hành': 2, 'lập_trình': 1, 'trực_tuyến': 1, 'miễn_phí': 1, 'truy_cập': 1, 'https://luyencode.net': 1, '300': 1, 'bài': 1, 'code': 1, 'thiếu_nhi': 1}
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ả.
luyện_code 2 thực_hành 2 website 1 lập_trình 1 trực_tuyến 1 miễn_phí 1 truy_cập 1 https://luyencode.net 1 300 1 bài 1 code 1 thiếu_nhi 1
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.
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.
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.
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 = [latex]frac{deg(w)}{freq(w)}[/latex] | 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.
$ pip install rake-nltk
from rake_nltk import Rake # Do nltk không có stopwords tiếng Việt, nên bạn cần cần có danh sách stopwords này. # https://github.com/ltkk/vietnamese-stopwords/blob/master/stopwords.txt punctuations = ".,;:?!()'"" stopwords = open('stopwords.txt').read().splitlines() r = Rake(stopwords, punctuations) r.extract_keywords_from_text("Lập_Trình Không Khó là một blog cá_nhân của Nguyễn_Văn_Hiếu") print(r.get_ranked_phrases_with_scores())
Kết quả sau khi chạy ta thu được:
[(4.0, 'blog cá_nhân'), (1.0, 'nguyễn_văn_hiếu'), (1.0, 'lập_trình'), (1.0, 'khó')]
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ừ [latex]w[/latex] đượ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ừ [latex]w[/latex] 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).
[latex display=”true”]casing(w) = frac{max( count(w is capital), count(w is acronym) )}{1 + log(count(w))}[/latex]
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ừ [latex]w[/latex].
[latex display=”true”]Sen(w) = text{Vị trí của các câu có chứa từ } w[/latex]
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:
[latex display=”true”]position(w) = log(log(3 + Median(Sen(w))))[/latex]
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)
[latex display=”true”]frequency(w) = frac{count of word w}{mean(counts) + standard deviation(counts)}[/latex]
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.
[latex display=”true”]relatedness(w) = 1 + (WR + WL) * frac{count(w)}{max count} + PL + PR[/latex]
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.
[latex display=”true”]different(w) = frac{number of sentences w occurs in}{total sentences}[/latex]
Đ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ừ:
[latex display=”true”]score(w) = frac{d * b}{a + (c / d) + (e / d)}[/latex]
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:
[latex display=”true”]S(keyword) = frac{product(scores of words in keyword)}{1 + (sum of scores of words) * count(keyword)}[/latex]
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:
- 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.
- Với mỗi từ khóa trong danh sách đã sắp xếp:
- 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.
- 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.
- 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:
$ pip install yake
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,
import yake text = 'Lập Trình Không Khó là blog chia sẻ kiến thức lập trình miễn phí . Do vậy , tệp khách hàng của chúng tôi chủ yếu là đối tượng học lập trình , độ tuổi từ 18 - 24 và hầu hết là người dùng đến từ Việt Nam . Lập Trình Không Khó có hơn 300.000 người dùng trung bình mỗi tháng , đóng góp lượt xem trang trung bình mỗi ngày trên 20.000 views . Trong đó , trên 80 % lượng truy cập đến từ công cụ tìm kiếm ( Google , Cốc Cốc , ... ) . Ngoài ra , nhóm Lập Trình Không Khó trên Facebook hoạt động sôi nổi có tới 30.000 thành viên .' # Ta cần custom stopword tiếng Việt do thư viện này không có sẵn stopword list cho tiếng Việt stopwords = open('stopwords.txt').read().splitlines() # Khởi tạo YAKE với ngôn ngữ tiếng Việt (làm màu), sinh ứng viên 1-gram và 2-gram, với custom stopwrod kw_extractor = yake.KeywordExtractor(lan='vi', n=2, stopwords=stopwords) # Truy vấn trích rút từ khóa keywords = kw_extractor.extract_keywords(text) for kw in keywords: print(kw)
('lập trình', 0.003917328975805501) ('việt nam', 0.0042290839214018505) ('cốc cốc', 0.006183540698175237) ('trung bình', 0.008101386806203302) ('bình mỗi', 0.008101386806203302) ('trình miễn', 0.01752732405092725) ('miễn phí', 0.019667925909521187) ('tệp khách', 0.019667925909521187) ('đóng góp', 0.019667925909521187) ('lượng truy', 0.019667925909521187) ('tìm kiếm', 0.019667925909521187) ('dùng trung', 0.020546477490141764) ('trình', 0.02172384902528891) ('trang trung', 0.02301966677519504) ('blog chia', 0.025798080473618208) ('kiến thức', 0.025798080473618208) ('khách hàng', 0.025798080473618208) ('chúng tôi', 0.025798080473618208) ('tôi chủ', 0.025798080473618208) ('chủ yếu', 0.025798080473618208)
Tài liệu tham khảo
- Unsupervised Keyphrase Extraction – Amit Chaudhary Blog
- Rose, Stuart & Engel, Dave & Cramer, Nick & Cowley, Wendy. (2010). Automatic Keyword Extraction from Individual Documents.10.1002/9780470689646.ch1
- Eirini Papagiannopoulou et al., “A Review of Keyphrase Extraction”
- Campos, R., Mangaravite, V., Pasquali, A., Jatowt, A., Jorge, A., Nunes, C. and Jatowt, A. (2020). YAKE! Keyword Extraction from Single Documents using Multiple Local Features. In Information Sciences Journal. Elsevier, Vol 509, pp 257-289
Bài viết liên quan:
Để lại một bình luận