Công cụ trích xuất từ khóa tự động cho văn bản tiếng Việt
Sử dụng PhoBERT + NER + VnCoreNLP
KeyBERTVi là công cụ trích xuất từ khóa (keyword extraction) cho tiếng Việt, lấy cảm hứng từ KeyBERT.
git clone https://github.com/NguyenTuan-UET/keyword-extraction-viet.git
cd keyword-extraction-viet
Công cụ trích xuất từ khóa tự động cho văn bản tiếng Việt
Sử dụng PhoBERT + NER + VnCoreNLP
KeyBERTVi là công cụ trích xuất từ khóa (keyword extraction) cho tiếng Việt, lấy cảm hứng từ KeyBERT.
git clone https://github.com/NguyenTuan-UET/keyword-extraction-viet.git
cd keyword-extraction-viet
Linux (Ubuntu/Debian):
sudo apt update
sudo apt install openjdk-11-jdk
Mac:
brew install openjdk@11
Windows: Download và cài đặt từ Oracle
Kiểm tra:
java -version
python3 -m venv .venv
source .venv/bin/activate # Linux/Mac
# hoặc
.venv\\Scripts\\activate # Windows
pip install -r requirements.txt
Models sẽ tự động tải về khi chạy lần đầu:
Lưu ý: Lần chạy đầu tiên sẽ mất 5-10 phút để tải models.
Có 3 cách để chạy dự án:
Chạy lệnh:
python app.py
Mở trình duyệt tại: http://localhost:7860
Tạo file test.py:
from pipeline import KeywordExtractorPipeline
from transformers import AutoModel, AutoModelForTokenClassification
# Load models
phobert = AutoModel.from_pretrained("vinai/phobert-base-v2")
ner_model = AutoModelForTokenClassification.from_pretrained("NlpHUST/ner-vietnamese-electra-base")
# Tạo pipeline
kw_pipeline = KeywordExtractorPipeline(phobert, ner_model)
# Trích xuất keywords
text = "Trường Đại học Công nghệ là một trong những trường hàng đầu về CNTT tại Việt Nam."
keywords = kw_pipeline(
inputs={"text": text},
top_n=5,
ngram_n=(1, 2),
min_freq=1,
diversify_result=False
)
print(keywords)
Chạy:
python test.py
Sửa file test_file.txt với văn bản của bạn, sau đó:
python pipeline.py
from pipeline import KeywordExtractorPipeline
from transformers import AutoModel, AutoModelForTokenClassification
# Load models
phobert = AutoModel.from_pretrained("vinai/phobert-base-v2")
ner_model = AutoModelForTokenClassification.from_pretrained("NlpHUST/ner-vietnamese-electra-base")
kw_pipeline = KeywordExtractorPipeline(phobert, ner_model)
# Văn bản đầu vào
text = """
Trí tuệ nhân tạo (AI) đang thay đổi cuộc sống con người.
Machine Learning và Deep Learning là hai nhánh quan trọng của AI.
Các ứng dụng AI xuất hiện ở mọi lĩnh vực từ y tế đến giáo dục.
"""
# Trích xuất 5 keywords
keywords = kw_pipeline(inputs={"text": text}, top_n=5)
# Kết quả: [('Trí_tuệ nhân_tạo', 0.89), ('Machine_Learning', 0.85), ...]
title = "Trí tuệ nhân tạo trong y tế"
text = "AI đang cách mạng hóa ngành y tế..."
keywords = kw_pipeline(
inputs={"title": title, "text": text}, # Có title
top_n=10
)
Lưu ý: Khi có title, nó sẽ được ghép vào đầu text và được tăng trọng số (x2).
# Chỉ từ đơn (unigrams)
keywords = kw_pipeline(
inputs={"text": text},
ngram_n=(1, 1), # min=1, max=1
top_n=5
)
# Từ đơn + cụm 2 từ (unigrams + bigrams)
keywords = kw_pipeline(
inputs={"text": text},
ngram_n=(1, 2), # min=1, max=2
top_n=5
)
# Cụm từ 1-3 từ (unigrams + bigrams + trigrams)
keywords = kw_pipeline(
inputs={"text": text},
ngram_n=(1, 3), # min=1, max=3
top_n=10
)
# Chỉ lấy keywords xuất hiện ≥2 lần
keywords = kw_pipeline(
inputs={"text": text},
min_freq=2, # Lọc keywords hiếm
top_n=10
)
Khuyến nghị:
min_freq=1min_freq=2min_freq=3-5# Không đa dạng hóa (lấy top keywords tương đồng nhất)
keywords = kw_pipeline(
inputs={"text": text},
diversify_result=False, # Default
top_n=5
)
# Đa dạng hóa (dùng K-means để nhóm keywords)
keywords = kw_pipeline(
inputs={"text": text},
diversify_result=True, # Bật diversification
top_n=5
)
Khi nào dùng diversify_result=True?
False để tập trungkw_pipeline()| Tham số | Kiểu | Mặc định | Mô tả |
|---|---|---|---|
inputs | dict | Bắt buộc | {"text": str} hoặc {"title": str, "text": str} |
top_n | int | 5 | Số lượng keywords trả về |
ngram_n | tuple | (1, 3) | Min và max số từ trong cụm. VD: (1,1), (1,2), (1,3), (2,3) |
min_freq | int | 1 | Lọc keywords xuất hiện dưới n lần |
diversify_result | bool | False | Đa dạng hóa kết quả bằng K-means |
inputs - Văn bản đầu vào# Chỉ có text
inputs = {"text": "Nội dung văn bản..."}
# Có cả title (title được tăng trọng số x2)
inputs = {
"title": "Tiêu đề bài viết",
"text": "Nội dung văn bản..."
}
top_n - Số lượng keywordstop_n=5 # Lấy 5 keywords
top_n=10 # Lấy 10 keywords
top_n=20 # Lấy 20 keywords
Khuyến nghị theo độ dài văn bản:
top_n=5top_n=10top_n=15-20ngram_n - Loại cụm từngram_n=(1, 1) # Chỉ từ đơn: "AI", "y_tế", "giáo_dục"
ngram_n=(1, 2) # Từ đơn + 2 từ: "AI", "trí_tuệ nhân_tạo"
ngram_n=(1, 3) # 1-3 từ: "AI", "trí_tuệ nhân_tạo", "trí_tuệ nhân_tạo trong y_tế"
ngram_n=(2, 3) # Chỉ cụm 2-3 từ (không có từ đơn)
Khuyến nghị:
(1, 2)(1, 3) ⭐ Phổ biến nhất(2, 3)min_freq - Tần suất tối thiểumin_freq=1 # Không lọc (giữ tất cả)
min_freq=2 # Chỉ giữ keywords xuất hiện ≥2 lần
min_freq=3 # Chỉ giữ keywords xuất hiện ≥3 lần
Khuyến nghị:
min_freq=1min_freq=2-3diversify_result - Đa dạng hóadiversify_result=False # Không đa dạng (lấy keywords tương đồng nhất)
diversify_result=True # Đa dạng hóa (dùng K-means clustering)
Cách hoạt động:
False: Lấy top-N keywords có cosine similarity cao nhất với documentTrue: Dùng K-means để nhóm keywords thành K clusters, lấy 1 đại diện mỗi clustertitle = "Apple ra mắt iPhone 15 với nhiều cải tiến"
text = """
Apple vừa chính thức giới thiệu dòng iPhone 15 tại sự kiện đặc biệt.
iPhone 15 Pro Max được trang bị chip A17 Bionic mạnh mẽ và camera 48MP.
Giá bán khởi điểm từ 999 USD tại thị trường Mỹ.
Sản phẩm sẽ có mặt tại Việt Nam vào tháng 10.
"""
keywords = kw_pipeline(
inputs={"title": title, "text": text},
top_n=8,
ngram_n=(1, 2),
min_freq=1,
diversify_result=True # Bài báo đề cập nhiều khía cạnh
)
# Kết quả có thể:
# [('iPhone_15', 0.92), ('Apple', 0.88), ('chip A17_Bionic', 0.85),
# ('camera 48MP', 0.82), ('giá_bán', 0.78), ...]
text = """
Nghiên cứu này tập trung vào ứng dụng học sâu trong xử lý ngôn ngữ tự nhiên.
Chúng tôi đề xuất mô hình Transformer cải tiến cho bài toán dịch máy.
Kết quả thử nghiệm trên tập dữ liệu IWSLT cho thấy BLEU score tăng 3.2 điểm.
Phương pháp của chúng tôi vượt trội so với các baseline hiện tại.
"""
keywords = kw_pipeline(
inputs={"text": text},
top_n=10,
ngram_n=(1, 3), # Bắt cụm từ chuyên ngành
min_freq=1,
diversify_result=False # Tập trung vào chủ đề chính
)
# Kết quả tập trung vào NLP & Deep Learning:
# [('học_sâu', 0.91), ('xử_lý ngôn_ngữ tự_nhiên', 0.89),
# ('mô_hình Transformer', 0.87), ('dịch_máy', 0.85), ...]
documents = [
"Văn bản 1 về AI...",
"Văn bản 2 về blockchain...",
"Văn bản 3 về IoT..."
]
all_keywords = []
for doc in documents:
keywords = kw_pipeline(
inputs={"text": doc},
top_n=5,
ngram_n=(1, 2)
)
all_keywords.append(keywords)
# Xử lý kết quả
for i, kws in enumerate(all_keywords):
print(f"Document {i+1}: {kws}")
# Cấu hình tối ưu cho bài báo dài, nhiều chủ đề
keywords = kw_pipeline(
inputs={
"title": "Tiêu đề bài báo",
"text": "Nội dung dài..."
},
top_n=15, # Lấy nhiều keywords
ngram_n=(1, 3), # Từ đơn đến cụm 3 từ
min_freq=2, # Lọc keywords hiếm
diversify_result=True # Đa dạng hóa
)
ModuleNotFoundErrorModuleNotFoundError: No module named 'transformers'
Nguyên nhân: Chưa cài dependencies
Giải pháp:
pip install -r requirements.txt
Exception: Unable to find javac
Nguyên nhân: Chưa cài Java JDK
Giải pháp:
# Ubuntu/Debian
sudo apt install openjdk-11-jdk
# Mac
brew install openjdk@11
# Windows: Tải từ oracle.com
Nguyên nhân: Models tải từ HuggingFace lần đầu (~1.2GB)
Giải pháp: Đợi 5-10 phút. Các lần sau sẽ dùng cache.
RuntimeError: CUDA out of memory
Nguyên nhân: GPU/RAM không đủ
Giải pháp:
top_nngram_n (ví dụ từ (1,3) xuống (1,2))Nguyên nhân: Tham số chưa phù hợp
Giải pháp:
top_n để xem nhiều kết quả hơndiversify_result=True hoặc Falsengram_n phù hợp với văn bảnmin_freq để lọc noiseOSError: [Errno 98] Address already in use
Giải pháp:
# Kill process đang dùng port 7860
lsof -ti:7860 | xargs kill -9
# Hoặc đổi port trong app.py:
# demo.launch(server_port=7861)
| Loại văn bản | top_n | ngram_n | min_freq | diversify |
|---|---|---|---|---|
| Bài báo ngắn | 5 | (1, 2) | 1 | False |
| Bài báo dài | 10-15 | (1, 3) | 2 | True |
| Văn bản học thuật | 10 | (1, 3) | 1 | False |
| Mô tả sản phẩm | 5-8 | (1, 2) | 1 | False |
| Tóm tắt nhiều chủ đề | 15-20 | (1, 3) | 2 | True |
keyword-extraction-viet/
├── app.py # Gradio web interface
├── pipeline.py # Main KeywordExtractorPipeline
├── requirements.txt # Dependencies
├── test_file.txt # File test mẫu
├── vietnamese-stopwords-dash.txt # Danh sách stopwords
├── model/
│ ├── keyword_extraction_utils.py # Core extraction logic
│ ├── named_entities.py # NER functions
│ └── process_text.py # Text preprocessing
└── pretrained-models/
└── vncorenlp/ # VnCoreNLP models
MIT License - Xem file LICENSE để biết chi tiết.
Nếu có vấn đề hoặc câu hỏi, vui lòng tạo Issue trên GitHub.
⭐ Nếu thấy hữu ích, hãy cho repo một star nhé! ⭐
min_freq=1,
diversify_result=False
)
print(keywords)
Chạy:
```bash
python test.py
from pipeline import KeywordExtractorPipeline
from transformers import AutoModel, AutoModelForTokenClassification
# Load models
phobert = AutoModel.from_pretrained("vinai/phobert-base-v2")
ner_model = AutoModelForTokenClassification.from_pretrained("NlpHUST/ner-vietnamese-electra-base")
kw_pipeline = KeywordExtractorPipeline(phobert, ner_model)
# Văn bản đầu vào
text = """
Trí tuệ nhân tạo (AI) đang thay đổi cuộc sống con người.
Machine Learning và Deep Learning là hai nhánh quan trọng của AI.
Các ứng dụng AI xuất hiện ở mọi lĩnh vực từ y tế đến giáo dục.
"""
# Trích xuất 5 keywords
keywords = kw_pipeline(inputs={"text": text}, top_n=5)
# Kết quả: [('Trí_tuệ nhân_tạo', 0.89), ('Machine_Learning', 0.85), ...]
title = "Trí tuệ nhân tạo trong y tế"
text = "AI đang cách mạng hóa ngành y tế..."
keywords = kw_pipeline(
inputs={"title": title, "text": text}, # Có title
top_n=10
)
Lưu ý: Khi có title, nó sẽ được ghép vào đầu text và được tăng trọng số (x2).
# Chỉ từ đơn (unigrams)
keywords = kw_pipeline(
inputs={"text": text},
ngram_n=(1, 1), # min=1, max=1
top_n=5
)
# Từ đơn + cụm 2 từ (unigrams + bigrams)
keywords = kw_pipeline(
inputs={"text": text},
ngram_n=(1, 2), # min=1, max=2
top_n=5
)
# Cụm từ 1-3 từ (unigrams + bigrams + trigrams)
keywords = kw_pipeline(
inputs={"text": text},
ngram_n=(1, 3), # min=1, max=3
top_n=10
)
# Chỉ lấy keywords xuất hiện ≥2 lần
keywords = kw_pipeline(
inputs={"text": text},
min_freq=2, # Lọc keywords hiếm
top_n=10
)
Khuyến nghị:
min_freq=1min_freq=2min_freq=3-5# Không đa dạng hóa (lấy top keywords tương đồng nhất)
keywords = kw_pipeline(
inputs={"text": text},
diversify_result=False, # Default
top_n=5
)
# Đa dạng hóa (dùng K-means để nhóm keywords)
keywords = kw_pipeline(
inputs={"text": text},
diversify_result=True, # Bật diversification
top_n=5
)
Khi nào dùng diversify_result=True?
False để tập trungkw_pipeline()| Tham số | Kiểu | Mặc định | Mô tả |
|---|---|---|---|
inputs | dict | Bắt buộc | {"text": str} hoặc {"title": str, "text": str} |
top_n | int | 5 | Số lượng keywords trả về |
ngram_n | tuple | (1, 3) | Min và max số từ trong cụm. VD: (1,1), (1,2), (1,3), (2,3) |
min_freq | int | 1 | Lọc keywords xuất hiện dưới n lần |
diversify_result | bool | False | Đa dạng hóa kết quả bằng K-means |
inputs - Văn bản đầu vào# Chỉ có text
inputs = {"text": "Nội dung văn bản..."}
# Có cả title (title được tăng trọng số x2)
inputs = {
"title": "Tiêu đề bài viết",
"text": "Nội dung văn bản..."
}
top_n - Số lượng keywordstop_n=5 # Lấy 5 keywords
top_n=10 # Lấy 10 keywords
top_n=20 # Lấy 20 keywords
Khuyến nghị theo độ dài văn bản:
top_n=5top_n=10top_n=15-20ngram_n - Loại cụm từngram_n=(1, 1) # Chỉ từ đơn: "AI", "y_tế", "giáo_dục"
ngram_n=(1, 2) # Từ đơn + 2 từ: "AI", "trí_tuệ nhân_tạo"
ngram_n=(1, 3) # 1-3 từ: "AI", "trí_tuệ nhân_tạo", "trí_tuệ nhân_tạo trong y_tế"
ngram_n=(2, 3) # Chỉ cụm 2-3 từ (không có từ đơn)
Khuyến nghị:
(1, 2)(1, 3) ⭐ Phổ biến nhất(2, 3)min_freq - Tần suất tối thiểumin_freq=1 # Không lọc (giữ tất cả)
min_freq=2 # Chỉ giữ keywords xuất hiện ≥2 lần
min_freq=3 # Chỉ giữ keywords xuất hiện ≥3 lần
Khuyến nghị:
min_freq=1min_freq=2-3diversify_result - Đa dạng hóadiversify_result=False # Không đa dạng (lấy keywords tương đồng nhất)
diversify_result=True # Đa dạng hóa (dùng K-means clustering)
Cách hoạt động:
False: Lấy top-N keywords có cosine similarity cao nhất với documentTrue: Dùng K-means để nhóm keywords thành K clusters, lấy 1 đại diện mỗi clusterKhi nào dùng?
| Trường hợp | Nên dùng |
|---|---|
| Văn bản một chủ đề rõ ràng | False |
| Văn bản nhiều chủ đề/khía cạnh | True |
| Muốn keywords tập trung vào chủ đề chính | False |
| Muốn keywords đa dạng, bao quát nhiều góc độ | True |
title = "Apple ra mắt iPhone 15 với nhiều cải tiến"
text = """
Apple vừa chính thức giới thiệu dòng iPhone 15 tại sự kiện đặc biệt.
iPhone 15 Pro Max được trang bị chip A17 Bionic mạnh mẽ và camera 48MP.
Giá bán khởi điểm từ 999 USD tại thị trường Mỹ.
Sản phẩm sẽ có mặt tại Việt Nam vào tháng 10.
"""
keywords = kw_pipeline(
inputs={"title": title, "text": text},
top_n=8,
ngram_n=(1, 2),
min_freq=1,
diversify_result=True # Bài báo đề cập nhiều khía cạnh
)
# Kết quả:
# [('iPhone_15', 0.92), ('Apple', 0.88), ('chip A17_Bionic', 0.85),
# ('camera 48MP', 0.82), ('giá_bán', 0.78), ...]
text = """
Nghiên cứu này tập trung vào ứng dụng học sâu trong xử lý ngôn ngữ tự nhiên.
Chúng tôi đề xuất mô hình Transformer cải tiến cho bài toán dịch máy.
Kết quả thử nghiệm trên tập dữ liệu IWSLT cho thấy BLEU score tăng 3.2 điểm.
Phương pháp của chúng tôi vượt trội so với các baseline hiện tại.
"""
keywords = kw_pipeline(
inputs={"text": text},
top_n=10,
ngram_n=(1, 3), # Bắt cụm từ chuyên ngành
min_freq=1,
diversify_result=False # Tập trung vào chủ đề chính
)
# Kết quả tập trung vào NLP & Deep Learning:
# [('học_sâu', 0.91), ('xử_lý ngôn_ngữ tự_nhiên', 0.89),
# ('mô_hình Transformer', 0.87), ('dịch_máy', 0.85), ...]
documents = [
"Văn bản 1 về AI...",
"Văn bản 2 về blockchain...",
"Văn bản 3 về IoT..."
]
all_keywords = []
for doc in documents:
keywords = kw_pipeline(
inputs={"text": doc},
top_n=5,
ngram_n=(1, 2)
)
all_keywords.append(keywords)
# Xử lý kết quả
for i, kws in enumerate(all_keywords):
print(f"Document {i+1}: {kws}")
# Cấu hình tối ưu cho bài báo dài, nhiều chủ đề
keywords = kw_pipeline(
inputs={
"title": "Tiêu đề bài báo",
"text": "Nội dung dài..."
},
top_n=15, # Lấy nhiều keywords
ngram_n=(1, 3), # Từ đơn đến cụm 3 từ
min_freq=2, # Lọc keywords hiếm
diversify_result=True # Đa dạng hóa
)
Gợi ý:
top_n để xem nhiều kết quả hơndiversify_result=True hoặc Falsengram_n phù hợp với văn bảnmin_freq để lọc noise| Loại văn bản | top_n | ngram_n | min_freq | diversify |
|---|---|---|---|---|
| Bài báo ngắn | 5 | (1, 2) | 1 | False |
| Bài báo dài | 10-15 | (1, 3) | 2 | True |
| Văn bản học thuật | 10 | (1, 3) | 1 | False |
| Mô tả sản phẩm | 5-8 | (1, 2) | 1 | False |
| Tóm tắt nhiều chủ đề | 15-20 | (1, 3) | 2 | True |
MIT License - Xem file LICENSE để biết chi tiết.
Nếu có vấn đề hoặc câu hỏi, vui lòng tạo Issue trên GitHub.
Công cụ trích xuất từ khóa tự động cho văn bản tiếng Việt
Sử dụng PhoBERT + NER + VnCoreNLP
KeyBERTVi là công cụ trích xuất từ khóa (keyword extraction) cho tiếng Việt, lấy cảm hứng từ KeyBERT.
git clone https://github.com/NguyenTuan-UET/keyword-extraction-viet.git
cd keyword-extraction-viet
Công cụ trích xuất từ khóa tự động cho văn bản tiếng Việt
Sử dụng PhoBERT + NER + VnCoreNLP
KeyBERTVi là công cụ trích xuất từ khóa (keyword extraction) cho tiếng Việt, lấy cảm hứng từ KeyBERT.
git clone https://github.com/NguyenTuan-UET/keyword-extraction-viet.git
cd keyword-extraction-viet
Linux (Ubuntu/Debian):
sudo apt update
sudo apt install openjdk-11-jdk
Mac:
brew install openjdk@11
Windows: Download và cài đặt từ Oracle
Kiểm tra:
java -version
python3 -m venv .venv
source .venv/bin/activate # Linux/Mac
# hoặc
.venv\\Scripts\\activate # Windows
pip install -r requirements.txt
Models sẽ tự động tải về khi chạy lần đầu:
Lưu ý: Lần chạy đầu tiên sẽ mất 5-10 phút để tải models.
Có 3 cách để chạy dự án:
Chạy lệnh:
python app.py
Mở trình duyệt tại: http://localhost:7860
Tạo file test.py:
from pipeline import KeywordExtractorPipeline
from transformers import AutoModel, AutoModelForTokenClassification
# Load models
phobert = AutoModel.from_pretrained("vinai/phobert-base-v2")
ner_model = AutoModelForTokenClassification.from_pretrained("NlpHUST/ner-vietnamese-electra-base")
# Tạo pipeline
kw_pipeline = KeywordExtractorPipeline(phobert, ner_model)
# Trích xuất keywords
text = "Trường Đại học Công nghệ là một trong những trường hàng đầu về CNTT tại Việt Nam."
keywords = kw_pipeline(
inputs={"text": text},
top_n=5,
ngram_n=(1, 2),
min_freq=1,
diversify_result=False
)
print(keywords)
Chạy:
python test.py
Sửa file test_file.txt với văn bản của bạn, sau đó:
python pipeline.py
from pipeline import KeywordExtractorPipeline
from transformers import AutoModel, AutoModelForTokenClassification
# Load models
phobert = AutoModel.from_pretrained("vinai/phobert-base-v2")
ner_model = AutoModelForTokenClassification.from_pretrained("NlpHUST/ner-vietnamese-electra-base")
kw_pipeline = KeywordExtractorPipeline(phobert, ner_model)
# Văn bản đầu vào
text = """
Trí tuệ nhân tạo (AI) đang thay đổi cuộc sống con người.
Machine Learning và Deep Learning là hai nhánh quan trọng của AI.
Các ứng dụng AI xuất hiện ở mọi lĩnh vực từ y tế đến giáo dục.
"""
# Trích xuất 5 keywords
keywords = kw_pipeline(inputs={"text": text}, top_n=5)
# Kết quả: [('Trí_tuệ nhân_tạo', 0.89), ('Machine_Learning', 0.85), ...]
title = "Trí tuệ nhân tạo trong y tế"
text = "AI đang cách mạng hóa ngành y tế..."
keywords = kw_pipeline(
inputs={"title": title, "text": text}, # Có title
top_n=10
)
Lưu ý: Khi có title, nó sẽ được ghép vào đầu text và được tăng trọng số (x2).
# Chỉ từ đơn (unigrams)
keywords = kw_pipeline(
inputs={"text": text},
ngram_n=(1, 1), # min=1, max=1
top_n=5
)
# Từ đơn + cụm 2 từ (unigrams + bigrams)
keywords = kw_pipeline(
inputs={"text": text},
ngram_n=(1, 2), # min=1, max=2
top_n=5
)
# Cụm từ 1-3 từ (unigrams + bigrams + trigrams)
keywords = kw_pipeline(
inputs={"text": text},
ngram_n=(1, 3), # min=1, max=3
top_n=10
)
# Chỉ lấy keywords xuất hiện ≥2 lần
keywords = kw_pipeline(
inputs={"text": text},
min_freq=2, # Lọc keywords hiếm
top_n=10
)
Khuyến nghị:
min_freq=1min_freq=2min_freq=3-5# Không đa dạng hóa (lấy top keywords tương đồng nhất)
keywords = kw_pipeline(
inputs={"text": text},
diversify_result=False, # Default
top_n=5
)
# Đa dạng hóa (dùng K-means để nhóm keywords)
keywords = kw_pipeline(
inputs={"text": text},
diversify_result=True, # Bật diversification
top_n=5
)
Khi nào dùng diversify_result=True?
False để tập trungkw_pipeline()| Tham số | Kiểu | Mặc định | Mô tả |
|---|---|---|---|
inputs | dict | Bắt buộc | {"text": str} hoặc {"title": str, "text": str} |
top_n | int | 5 | Số lượng keywords trả về |
ngram_n | tuple | (1, 3) | Min và max số từ trong cụm. VD: (1,1), (1,2), (1,3), (2,3) |
min_freq | int | 1 | Lọc keywords xuất hiện dưới n lần |
diversify_result | bool | False | Đa dạng hóa kết quả bằng K-means |
inputs - Văn bản đầu vào# Chỉ có text
inputs = {"text": "Nội dung văn bản..."}
# Có cả title (title được tăng trọng số x2)
inputs = {
"title": "Tiêu đề bài viết",
"text": "Nội dung văn bản..."
}
top_n - Số lượng keywordstop_n=5 # Lấy 5 keywords
top_n=10 # Lấy 10 keywords
top_n=20 # Lấy 20 keywords
Khuyến nghị theo độ dài văn bản:
top_n=5top_n=10top_n=15-20ngram_n - Loại cụm từngram_n=(1, 1) # Chỉ từ đơn: "AI", "y_tế", "giáo_dục"
ngram_n=(1, 2) # Từ đơn + 2 từ: "AI", "trí_tuệ nhân_tạo"
ngram_n=(1, 3) # 1-3 từ: "AI", "trí_tuệ nhân_tạo", "trí_tuệ nhân_tạo trong y_tế"
ngram_n=(2, 3) # Chỉ cụm 2-3 từ (không có từ đơn)
Khuyến nghị:
(1, 2)(1, 3) ⭐ Phổ biến nhất(2, 3)min_freq - Tần suất tối thiểumin_freq=1 # Không lọc (giữ tất cả)
min_freq=2 # Chỉ giữ keywords xuất hiện ≥2 lần
min_freq=3 # Chỉ giữ keywords xuất hiện ≥3 lần
Khuyến nghị:
min_freq=1min_freq=2-3diversify_result - Đa dạng hóadiversify_result=False # Không đa dạng (lấy keywords tương đồng nhất)
diversify_result=True # Đa dạng hóa (dùng K-means clustering)
Cách hoạt động:
False: Lấy top-N keywords có cosine similarity cao nhất với documentTrue: Dùng K-means để nhóm keywords thành K clusters, lấy 1 đại diện mỗi clustertitle = "Apple ra mắt iPhone 15 với nhiều cải tiến"
text = """
Apple vừa chính thức giới thiệu dòng iPhone 15 tại sự kiện đặc biệt.
iPhone 15 Pro Max được trang bị chip A17 Bionic mạnh mẽ và camera 48MP.
Giá bán khởi điểm từ 999 USD tại thị trường Mỹ.
Sản phẩm sẽ có mặt tại Việt Nam vào tháng 10.
"""
keywords = kw_pipeline(
inputs={"title": title, "text": text},
top_n=8,
ngram_n=(1, 2),
min_freq=1,
diversify_result=True # Bài báo đề cập nhiều khía cạnh
)
# Kết quả có thể:
# [('iPhone_15', 0.92), ('Apple', 0.88), ('chip A17_Bionic', 0.85),
# ('camera 48MP', 0.82), ('giá_bán', 0.78), ...]
text = """
Nghiên cứu này tập trung vào ứng dụng học sâu trong xử lý ngôn ngữ tự nhiên.
Chúng tôi đề xuất mô hình Transformer cải tiến cho bài toán dịch máy.
Kết quả thử nghiệm trên tập dữ liệu IWSLT cho thấy BLEU score tăng 3.2 điểm.
Phương pháp của chúng tôi vượt trội so với các baseline hiện tại.
"""
keywords = kw_pipeline(
inputs={"text": text},
top_n=10,
ngram_n=(1, 3), # Bắt cụm từ chuyên ngành
min_freq=1,
diversify_result=False # Tập trung vào chủ đề chính
)
# Kết quả tập trung vào NLP & Deep Learning:
# [('học_sâu', 0.91), ('xử_lý ngôn_ngữ tự_nhiên', 0.89),
# ('mô_hình Transformer', 0.87), ('dịch_máy', 0.85), ...]
documents = [
"Văn bản 1 về AI...",
"Văn bản 2 về blockchain...",
"Văn bản 3 về IoT..."
]
all_keywords = []
for doc in documents:
keywords = kw_pipeline(
inputs={"text": doc},
top_n=5,
ngram_n=(1, 2)
)
all_keywords.append(keywords)
# Xử lý kết quả
for i, kws in enumerate(all_keywords):
print(f"Document {i+1}: {kws}")
# Cấu hình tối ưu cho bài báo dài, nhiều chủ đề
keywords = kw_pipeline(
inputs={
"title": "Tiêu đề bài báo",
"text": "Nội dung dài..."
},
top_n=15, # Lấy nhiều keywords
ngram_n=(1, 3), # Từ đơn đến cụm 3 từ
min_freq=2, # Lọc keywords hiếm
diversify_result=True # Đa dạng hóa
)
ModuleNotFoundErrorModuleNotFoundError: No module named 'transformers'
Nguyên nhân: Chưa cài dependencies
Giải pháp:
pip install -r requirements.txt
Exception: Unable to find javac
Nguyên nhân: Chưa cài Java JDK
Giải pháp:
# Ubuntu/Debian
sudo apt install openjdk-11-jdk
# Mac
brew install openjdk@11
# Windows: Tải từ oracle.com
Nguyên nhân: Models tải từ HuggingFace lần đầu (~1.2GB)
Giải pháp: Đợi 5-10 phút. Các lần sau sẽ dùng cache.
RuntimeError: CUDA out of memory
Nguyên nhân: GPU/RAM không đủ
Giải pháp:
top_nngram_n (ví dụ từ (1,3) xuống (1,2))Nguyên nhân: Tham số chưa phù hợp
Giải pháp:
top_n để xem nhiều kết quả hơndiversify_result=True hoặc Falsengram_n phù hợp với văn bảnmin_freq để lọc noiseOSError: [Errno 98] Address already in use
Giải pháp:
# Kill process đang dùng port 7860
lsof -ti:7860 | xargs kill -9
# Hoặc đổi port trong app.py:
# demo.launch(server_port=7861)
| Loại văn bản | top_n | ngram_n | min_freq | diversify |
|---|---|---|---|---|
| Bài báo ngắn | 5 | (1, 2) | 1 | False |
| Bài báo dài | 10-15 | (1, 3) | 2 | True |
| Văn bản học thuật | 10 | (1, 3) | 1 | False |
| Mô tả sản phẩm | 5-8 | (1, 2) | 1 | False |
| Tóm tắt nhiều chủ đề | 15-20 | (1, 3) | 2 | True |
keyword-extraction-viet/
├── app.py # Gradio web interface
├── pipeline.py # Main KeywordExtractorPipeline
├── requirements.txt # Dependencies
├── test_file.txt # File test mẫu
├── vietnamese-stopwords-dash.txt # Danh sách stopwords
├── model/
│ ├── keyword_extraction_utils.py # Core extraction logic
│ ├── named_entities.py # NER functions
│ └── process_text.py # Text preprocessing
└── pretrained-models/
└── vncorenlp/ # VnCoreNLP models
MIT License - Xem file LICENSE để biết chi tiết.
Nếu có vấn đề hoặc câu hỏi, vui lòng tạo Issue trên GitHub.
⭐ Nếu thấy hữu ích, hãy cho repo một star nhé! ⭐
min_freq=1,
diversify_result=False
)
print(keywords)
Chạy:
```bash
python test.py
from pipeline import KeywordExtractorPipeline
from transformers import AutoModel, AutoModelForTokenClassification
# Load models
phobert = AutoModel.from_pretrained("vinai/phobert-base-v2")
ner_model = AutoModelForTokenClassification.from_pretrained("NlpHUST/ner-vietnamese-electra-base")
kw_pipeline = KeywordExtractorPipeline(phobert, ner_model)
# Văn bản đầu vào
text = """
Trí tuệ nhân tạo (AI) đang thay đổi cuộc sống con người.
Machine Learning và Deep Learning là hai nhánh quan trọng của AI.
Các ứng dụng AI xuất hiện ở mọi lĩnh vực từ y tế đến giáo dục.
"""
# Trích xuất 5 keywords
keywords = kw_pipeline(inputs={"text": text}, top_n=5)
# Kết quả: [('Trí_tuệ nhân_tạo', 0.89), ('Machine_Learning', 0.85), ...]
title = "Trí tuệ nhân tạo trong y tế"
text = "AI đang cách mạng hóa ngành y tế..."
keywords = kw_pipeline(
inputs={"title": title, "text": text}, # Có title
top_n=10
)
Lưu ý: Khi có title, nó sẽ được ghép vào đầu text và được tăng trọng số (x2).
# Chỉ từ đơn (unigrams)
keywords = kw_pipeline(
inputs={"text": text},
ngram_n=(1, 1), # min=1, max=1
top_n=5
)
# Từ đơn + cụm 2 từ (unigrams + bigrams)
keywords = kw_pipeline(
inputs={"text": text},
ngram_n=(1, 2), # min=1, max=2
top_n=5
)
# Cụm từ 1-3 từ (unigrams + bigrams + trigrams)
keywords = kw_pipeline(
inputs={"text": text},
ngram_n=(1, 3), # min=1, max=3
top_n=10
)
# Chỉ lấy keywords xuất hiện ≥2 lần
keywords = kw_pipeline(
inputs={"text": text},
min_freq=2, # Lọc keywords hiếm
top_n=10
)
Khuyến nghị:
min_freq=1min_freq=2min_freq=3-5# Không đa dạng hóa (lấy top keywords tương đồng nhất)
keywords = kw_pipeline(
inputs={"text": text},
diversify_result=False, # Default
top_n=5
)
# Đa dạng hóa (dùng K-means để nhóm keywords)
keywords = kw_pipeline(
inputs={"text": text},
diversify_result=True, # Bật diversification
top_n=5
)
Khi nào dùng diversify_result=True?
False để tập trungkw_pipeline()| Tham số | Kiểu | Mặc định | Mô tả |
|---|---|---|---|
inputs | dict | Bắt buộc | {"text": str} hoặc {"title": str, "text": str} |
top_n | int | 5 | Số lượng keywords trả về |
ngram_n | tuple | (1, 3) | Min và max số từ trong cụm. VD: (1,1), (1,2), (1,3), (2,3) |
min_freq | int | 1 | Lọc keywords xuất hiện dưới n lần |
diversify_result | bool | False | Đa dạng hóa kết quả bằng K-means |
inputs - Văn bản đầu vào# Chỉ có text
inputs = {"text": "Nội dung văn bản..."}
# Có cả title (title được tăng trọng số x2)
inputs = {
"title": "Tiêu đề bài viết",
"text": "Nội dung văn bản..."
}
top_n - Số lượng keywordstop_n=5 # Lấy 5 keywords
top_n=10 # Lấy 10 keywords
top_n=20 # Lấy 20 keywords
Khuyến nghị theo độ dài văn bản:
top_n=5top_n=10top_n=15-20ngram_n - Loại cụm từngram_n=(1, 1) # Chỉ từ đơn: "AI", "y_tế", "giáo_dục"
ngram_n=(1, 2) # Từ đơn + 2 từ: "AI", "trí_tuệ nhân_tạo"
ngram_n=(1, 3) # 1-3 từ: "AI", "trí_tuệ nhân_tạo", "trí_tuệ nhân_tạo trong y_tế"
ngram_n=(2, 3) # Chỉ cụm 2-3 từ (không có từ đơn)
Khuyến nghị:
(1, 2)(1, 3) ⭐ Phổ biến nhất(2, 3)min_freq - Tần suất tối thiểumin_freq=1 # Không lọc (giữ tất cả)
min_freq=2 # Chỉ giữ keywords xuất hiện ≥2 lần
min_freq=3 # Chỉ giữ keywords xuất hiện ≥3 lần
Khuyến nghị:
min_freq=1min_freq=2-3diversify_result - Đa dạng hóadiversify_result=False # Không đa dạng (lấy keywords tương đồng nhất)
diversify_result=True # Đa dạng hóa (dùng K-means clustering)
Cách hoạt động:
False: Lấy top-N keywords có cosine similarity cao nhất với documentTrue: Dùng K-means để nhóm keywords thành K clusters, lấy 1 đại diện mỗi clusterKhi nào dùng?
| Trường hợp | Nên dùng |
|---|---|
| Văn bản một chủ đề rõ ràng | False |
| Văn bản nhiều chủ đề/khía cạnh | True |
| Muốn keywords tập trung vào chủ đề chính | False |
| Muốn keywords đa dạng, bao quát nhiều góc độ | True |
title = "Apple ra mắt iPhone 15 với nhiều cải tiến"
text = """
Apple vừa chính thức giới thiệu dòng iPhone 15 tại sự kiện đặc biệt.
iPhone 15 Pro Max được trang bị chip A17 Bionic mạnh mẽ và camera 48MP.
Giá bán khởi điểm từ 999 USD tại thị trường Mỹ.
Sản phẩm sẽ có mặt tại Việt Nam vào tháng 10.
"""
keywords = kw_pipeline(
inputs={"title": title, "text": text},
top_n=8,
ngram_n=(1, 2),
min_freq=1,
diversify_result=True # Bài báo đề cập nhiều khía cạnh
)
# Kết quả:
# [('iPhone_15', 0.92), ('Apple', 0.88), ('chip A17_Bionic', 0.85),
# ('camera 48MP', 0.82), ('giá_bán', 0.78), ...]
text = """
Nghiên cứu này tập trung vào ứng dụng học sâu trong xử lý ngôn ngữ tự nhiên.
Chúng tôi đề xuất mô hình Transformer cải tiến cho bài toán dịch máy.
Kết quả thử nghiệm trên tập dữ liệu IWSLT cho thấy BLEU score tăng 3.2 điểm.
Phương pháp của chúng tôi vượt trội so với các baseline hiện tại.
"""
keywords = kw_pipeline(
inputs={"text": text},
top_n=10,
ngram_n=(1, 3), # Bắt cụm từ chuyên ngành
min_freq=1,
diversify_result=False # Tập trung vào chủ đề chính
)
# Kết quả tập trung vào NLP & Deep Learning:
# [('học_sâu', 0.91), ('xử_lý ngôn_ngữ tự_nhiên', 0.89),
# ('mô_hình Transformer', 0.87), ('dịch_máy', 0.85), ...]
documents = [
"Văn bản 1 về AI...",
"Văn bản 2 về blockchain...",
"Văn bản 3 về IoT..."
]
all_keywords = []
for doc in documents:
keywords = kw_pipeline(
inputs={"text": doc},
top_n=5,
ngram_n=(1, 2)
)
all_keywords.append(keywords)
# Xử lý kết quả
for i, kws in enumerate(all_keywords):
print(f"Document {i+1}: {kws}")
# Cấu hình tối ưu cho bài báo dài, nhiều chủ đề
keywords = kw_pipeline(
inputs={
"title": "Tiêu đề bài báo",
"text": "Nội dung dài..."
},
top_n=15, # Lấy nhiều keywords
ngram_n=(1, 3), # Từ đơn đến cụm 3 từ
min_freq=2, # Lọc keywords hiếm
diversify_result=True # Đa dạng hóa
)
Gợi ý:
top_n để xem nhiều kết quả hơndiversify_result=True hoặc Falsengram_n phù hợp với văn bảnmin_freq để lọc noise| Loại văn bản | top_n | ngram_n | min_freq | diversify |
|---|---|---|---|---|
| Bài báo ngắn | 5 | (1, 2) | 1 | False |
| Bài báo dài | 10-15 | (1, 3) | 2 | True |
| Văn bản học thuật | 10 | (1, 3) | 1 | False |
| Mô tả sản phẩm | 5-8 | (1, 2) | 1 | False |
| Tóm tắt nhiều chủ đề | 15-20 | (1, 3) | 2 | True |
MIT License - Xem file LICENSE để biết chi tiết.
Nếu có vấn đề hoặc câu hỏi, vui lòng tạo Issue trên GitHub.