Spaces:
Sleeping
Sleeping
Upload 10 files
Browse files- README.md +22 -3
- app.py +436 -0
- models/decoder_only.weights.h5 +3 -0
- models/decoder_tokenizer_re.pkl +3 -0
- packages.txt +1 -0
- py/Vietnamese-stopwords.txt +1942 -0
- py/__init__.py +23 -0
- py/abstractive.py +245 -0
- py/extractive.py +112 -0
- requirements.txt +21 -0
README.md
CHANGED
|
@@ -1,12 +1,31 @@
|
|
| 1 |
---
|
| 2 |
title: Vietnamese Text Summarizer
|
| 3 |
-
emoji:
|
| 4 |
colorFrom: blue
|
| 5 |
-
colorTo:
|
| 6 |
sdk: gradio
|
| 7 |
sdk_version: 6.1.0
|
| 8 |
app_file: app.py
|
| 9 |
pinned: false
|
|
|
|
| 10 |
---
|
| 11 |
|
| 12 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
---
|
| 2 |
title: Vietnamese Text Summarizer
|
| 3 |
+
emoji: 🤖
|
| 4 |
colorFrom: blue
|
| 5 |
+
colorTo: purple
|
| 6 |
sdk: gradio
|
| 7 |
sdk_version: 6.1.0
|
| 8 |
app_file: app.py
|
| 9 |
pinned: false
|
| 10 |
+
license: mit
|
| 11 |
---
|
| 12 |
|
| 13 |
+
# 🇻🇳 Vietnamese Text Summarizer
|
| 14 |
+
|
| 15 |
+
Hệ thống tóm tắt văn bản tiếng Việt sử dụng hai phương pháp: **Extractive** và **Abstractive**.
|
| 16 |
+
|
| 17 |
+
## 🚀 Tính năng
|
| 18 |
+
|
| 19 |
+
- **Extractive Summarization**: Trích xuất các câu quan trọng từ văn bản gốc
|
| 20 |
+
- **Abstractive Summarization**: Tạo tóm tắt mới bằng mô hình Transformer với PhoBERT
|
| 21 |
+
- **Đánh giá tự động**: Tính toán BLEU và ROUGE scores
|
| 22 |
+
- **So sánh trực quan**: Biểu đồ so sánh chất lượng giữa hai phương pháp
|
| 23 |
+
|
| 24 |
+
## 🎯 Cách sử dụng
|
| 25 |
+
|
| 26 |
+
1. **Nhập văn bản** tiếng Việt cần tóm tắt
|
| 27 |
+
2. **Chọn phương pháp**
|
| 28 |
+
3. **So sánh kết quả** với tóm tắt gốc (nếu có)
|
| 29 |
+
4. **Xem biểu đồ** đánh giá tự động
|
| 30 |
+
|
| 31 |
+
## 📁 Cấu trúc project
|
app.py
ADDED
|
@@ -0,0 +1,436 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# app.py
|
| 2 |
+
# Improved Gradio UI for Vietnamese Text Summarization (Extractive + Abstractive)
|
| 3 |
+
# Designed for deployment on Hugging Face Spaces (or similar).
|
| 4 |
+
# Keeps the original technologies: PhoBERT + custom TF decoder, TextRank extractive.
|
| 5 |
+
import os
|
| 6 |
+
import sys
|
| 7 |
+
import shutil
|
| 8 |
+
import tempfile
|
| 9 |
+
import importlib
|
| 10 |
+
from io import BytesIO
|
| 11 |
+
from typing import List, Optional
|
| 12 |
+
|
| 13 |
+
import gradio as gr
|
| 14 |
+
import numpy as np
|
| 15 |
+
import matplotlib.pyplot as plt
|
| 16 |
+
from PIL import Image
|
| 17 |
+
from rouge_score import rouge_scorer
|
| 18 |
+
from nltk.translate.bleu_score import sentence_bleu, SmoothingFunction
|
| 19 |
+
|
| 20 |
+
# Ensure repo root on path so py package is importable
|
| 21 |
+
ROOT_DIR = os.path.dirname(os.path.abspath(__file__))
|
| 22 |
+
if ROOT_DIR not in sys.path:
|
| 23 |
+
sys.path.insert(0, ROOT_DIR)
|
| 24 |
+
|
| 25 |
+
# Add py/ to path for summarizer modules
|
| 26 |
+
PY_DIR = os.path.join(ROOT_DIR, "py")
|
| 27 |
+
if PY_DIR not in sys.path:
|
| 28 |
+
sys.path.insert(0, PY_DIR)
|
| 29 |
+
|
| 30 |
+
|
| 31 |
+
smooth = SmoothingFunction().method1
|
| 32 |
+
|
| 33 |
+
# Lazy singletons for summarizers
|
| 34 |
+
ext_summarizer = None
|
| 35 |
+
abs_summarizer = None
|
| 36 |
+
|
| 37 |
+
DEFAULT_MODEL_DIR = os.path.join(ROOT_DIR, "models")
|
| 38 |
+
os.makedirs(DEFAULT_MODEL_DIR, exist_ok=True)
|
| 39 |
+
|
| 40 |
+
|
| 41 |
+
# Utilities to import summarizer modules (robust to py/ package or root)
|
| 42 |
+
def import_summarizer_module(base_name: str):
|
| 43 |
+
candidates = [f"py.{base_name}", base_name]
|
| 44 |
+
last_err = None
|
| 45 |
+
for mod_name in candidates:
|
| 46 |
+
try:
|
| 47 |
+
module = importlib.import_module(mod_name)
|
| 48 |
+
return module
|
| 49 |
+
except Exception as e:
|
| 50 |
+
last_err = e
|
| 51 |
+
raise ImportError(f"No module named '{base_name}' (tried {candidates}). Last error: {last_err}")
|
| 52 |
+
|
| 53 |
+
|
| 54 |
+
def get_ext_summarizer():
|
| 55 |
+
global ext_summarizer
|
| 56 |
+
if ext_summarizer is None:
|
| 57 |
+
mod = import_summarizer_module("extractive")
|
| 58 |
+
ExtractiveSummarizer = getattr(mod, "ExtractiveSummarizer")
|
| 59 |
+
ext_summarizer = ExtractiveSummarizer()
|
| 60 |
+
return ext_summarizer
|
| 61 |
+
|
| 62 |
+
|
| 63 |
+
def get_abs_summarizer(model_dir: Optional[str] = None):
|
| 64 |
+
global abs_summarizer
|
| 65 |
+
if abs_summarizer is None:
|
| 66 |
+
mod = import_summarizer_module("abstractive")
|
| 67 |
+
AbstractiveSummarizer = getattr(mod, "AbstractiveSummarizer")
|
| 68 |
+
model_dir = model_dir or DEFAULT_MODEL_DIR
|
| 69 |
+
abs_summarizer = AbstractiveSummarizer(model_dir=model_dir)
|
| 70 |
+
return abs_summarizer
|
| 71 |
+
|
| 72 |
+
|
| 73 |
+
# Summarization functions used by the UI
|
| 74 |
+
def generate_extractive(article: str, top_n: int, state):
|
| 75 |
+
"""
|
| 76 |
+
Generate extractive summary.
|
| 77 |
+
Returns (summary_text, new_state)
|
| 78 |
+
"""
|
| 79 |
+
if not article or not article.strip():
|
| 80 |
+
return "Vui lòng nhập văn bản để tóm tắt.", state
|
| 81 |
+
|
| 82 |
+
try:
|
| 83 |
+
summarizer = get_ext_summarizer()
|
| 84 |
+
summary = summarizer.summarize(article, top_n=top_n)
|
| 85 |
+
if not summary or len(summary.strip()) < 10:
|
| 86 |
+
summary = "Không thể tạo tóm tắt từ văn bản này. Vui lòng thử văn bản dài hơn."
|
| 87 |
+
except Exception as e:
|
| 88 |
+
summary = f"Lỗi khi chạy Extractive: {e}"
|
| 89 |
+
return summary, summary
|
| 90 |
+
|
| 91 |
+
|
| 92 |
+
def generate_abstractive(article: str, beam_k: int, state, model_dir=DEFAULT_MODEL_DIR):
|
| 93 |
+
"""
|
| 94 |
+
Generate abstractive summary.
|
| 95 |
+
Returns (summary_text, new_state)
|
| 96 |
+
"""
|
| 97 |
+
if not article or not article.strip():
|
| 98 |
+
return "Vui lòng nhập văn bản để tóm tắt.", state
|
| 99 |
+
|
| 100 |
+
try:
|
| 101 |
+
# Try to lazily load abstractive summarizer
|
| 102 |
+
summarizer = get_abs_summarizer(model_dir=model_dir)
|
| 103 |
+
summary = summarizer.summarize(article, k=int(beam_k))
|
| 104 |
+
if not summary or len(summary.strip()) < 10:
|
| 105 |
+
summary = "Không thể tạo tóm tắt từ văn bản này. Vui lòng thử văn bản dài hơn."
|
| 106 |
+
except FileNotFoundError as e:
|
| 107 |
+
summary = f"Abstractive model chưa sẵn sàng: {e}"
|
| 108 |
+
except Exception as e:
|
| 109 |
+
summary = f"Lỗi khi chạy Abstractive: {e}"
|
| 110 |
+
return summary, summary
|
| 111 |
+
|
| 112 |
+
|
| 113 |
+
# Evaluation function produces a bar chart comparing metrics
|
| 114 |
+
def evaluate_and_plot(reference: str, ext_summary: str, abs_summary: str):
|
| 115 |
+
ref = reference or ""
|
| 116 |
+
ext = ext_summary or ""
|
| 117 |
+
abs_ = abs_summary or ""
|
| 118 |
+
|
| 119 |
+
def safe_tokens(text):
|
| 120 |
+
return [t for t in text.split() if t.strip()]
|
| 121 |
+
|
| 122 |
+
# BLEU
|
| 123 |
+
try:
|
| 124 |
+
ref_tokens = safe_tokens(ref)
|
| 125 |
+
if ref_tokens and ext:
|
| 126 |
+
bleu1_ext = sentence_bleu([ref_tokens], safe_tokens(ext), weights=(1, 0, 0, 0), smoothing_function=smooth)
|
| 127 |
+
bleu4_ext = sentence_bleu([ref_tokens], safe_tokens(ext), weights=(0.25, 0.25, 0.25, 0.25), smoothing_function=smooth)
|
| 128 |
+
else:
|
| 129 |
+
bleu1_ext = bleu4_ext = 0.0
|
| 130 |
+
|
| 131 |
+
if ref_tokens and abs_:
|
| 132 |
+
bleu1_abs = sentence_bleu([ref_tokens], safe_tokens(abs_), weights=(1, 0, 0, 0), smoothing_function=smooth)
|
| 133 |
+
bleu4_abs = sentence_bleu([ref_tokens], safe_tokens(abs_), weights=(0.25, 0.25, 0.25, 0.25), smoothing_function=smooth)
|
| 134 |
+
else:
|
| 135 |
+
bleu1_abs = bleu4_abs = 0.0
|
| 136 |
+
except Exception:
|
| 137 |
+
bleu1_ext = bleu4_ext = bleu1_abs = bleu4_abs = 0.0
|
| 138 |
+
|
| 139 |
+
# ROUGE
|
| 140 |
+
rouge = rouge_scorer.RougeScorer(['rouge1', 'rouge2', 'rougeL'], use_stemmer=True)
|
| 141 |
+
try:
|
| 142 |
+
if ref and ext:
|
| 143 |
+
ext_r = rouge.score(ref, ext)
|
| 144 |
+
else:
|
| 145 |
+
ext_r = {'rouge1': None, 'rouge2': None, 'rougeL': None}
|
| 146 |
+
if ref and abs_:
|
| 147 |
+
abs_r = rouge.score(ref, abs_)
|
| 148 |
+
else:
|
| 149 |
+
abs_r = {'rouge1': None, 'rouge2': None, 'rougeL': None}
|
| 150 |
+
except Exception:
|
| 151 |
+
ext_r = abs_r = {'rouge1': None, 'rouge2': None, 'rougeL': None}
|
| 152 |
+
|
| 153 |
+
metrics = ["BLEU-1", "BLEU-4", "ROUGE-1", "ROUGE-2", "ROUGE-L"]
|
| 154 |
+
ext_vals = [
|
| 155 |
+
float(bleu1_ext or 0.0),
|
| 156 |
+
float(bleu4_ext or 0.0),
|
| 157 |
+
float(ext_r['rouge1'].fmeasure) if ext_r['rouge1'] is not None else 0.0,
|
| 158 |
+
float(ext_r['rouge2'].fmeasure) if ext_r['rouge2'] is not None else 0.0,
|
| 159 |
+
float(ext_r['rougeL'].fmeasure) if ext_r['rougeL'] is not None else 0.0,
|
| 160 |
+
]
|
| 161 |
+
abs_vals = [
|
| 162 |
+
float(bleu1_abs or 0.0),
|
| 163 |
+
float(bleu4_abs or 0.0),
|
| 164 |
+
float(abs_r['rouge1'].fmeasure) if abs_r['rouge1'] is not None else 0.0,
|
| 165 |
+
float(abs_r['rouge2'].fmeasure) if abs_r['rouge2'] is not None else 0.0,
|
| 166 |
+
float(abs_r['rougeL'].fmeasure) if abs_r['rougeL'] is not None else 0.0,
|
| 167 |
+
]
|
| 168 |
+
|
| 169 |
+
# Plot
|
| 170 |
+
x = np.arange(len(metrics))
|
| 171 |
+
width = 0.35
|
| 172 |
+
fig, ax = plt.subplots(figsize=(9, 4))
|
| 173 |
+
ax.bar(x - width / 2, ext_vals, width, label='Extractive', color="#66B2FF")
|
| 174 |
+
ax.bar(x + width / 2, abs_vals, width, label='Abstractive', color="#FF9999")
|
| 175 |
+
ax.set_ylabel("Score")
|
| 176 |
+
ax.set_title("Comparison: Extractive vs Abstractive")
|
| 177 |
+
ax.set_xticks(x)
|
| 178 |
+
ax.set_xticklabels(metrics)
|
| 179 |
+
ax.set_ylim(0, 1)
|
| 180 |
+
ax.legend(loc='upper right')
|
| 181 |
+
for i, v in enumerate(ext_vals):
|
| 182 |
+
ax.text(i - width / 2, v + 0.02, f"{v:.3f}", ha='center', fontsize=9)
|
| 183 |
+
for i, v in enumerate(abs_vals):
|
| 184 |
+
ax.text(i + width / 2, v + 0.02, f"{v:.3f}", ha='center', fontsize=9)
|
| 185 |
+
plt.tight_layout()
|
| 186 |
+
|
| 187 |
+
buf = BytesIO()
|
| 188 |
+
fig.savefig(buf, format="png", dpi=100)
|
| 189 |
+
plt.close(fig)
|
| 190 |
+
buf.seek(0)
|
| 191 |
+
img = Image.open(buf).convert("RGB")
|
| 192 |
+
return img
|
| 193 |
+
|
| 194 |
+
|
| 195 |
+
# Utility: save uploaded model files to models/ directory
|
| 196 |
+
def save_model_files(uploaded_files: List[gr.File], model_dir: str = DEFAULT_MODEL_DIR):
|
| 197 |
+
"""
|
| 198 |
+
uploaded_files: list of gradio uploaded file objects
|
| 199 |
+
Returns status message.
|
| 200 |
+
"""
|
| 201 |
+
if not uploaded_files:
|
| 202 |
+
return "Không có tệp được tải lên."
|
| 203 |
+
|
| 204 |
+
os.makedirs(model_dir, exist_ok=True)
|
| 205 |
+
saved = []
|
| 206 |
+
errors = []
|
| 207 |
+
for f in uploaded_files:
|
| 208 |
+
try:
|
| 209 |
+
# Different Gradio versions expose different attributes; try common ones
|
| 210 |
+
src_path = None
|
| 211 |
+
if hasattr(f, "name") and os.path.exists(f.name):
|
| 212 |
+
src_path = f.name
|
| 213 |
+
elif hasattr(f, "tmp_path") and os.path.exists(f.tmp_path):
|
| 214 |
+
src_path = f.tmp_path
|
| 215 |
+
elif isinstance(f, dict) and "name" in f and "tmp_path" in f and os.path.exists(f["tmp_path"]):
|
| 216 |
+
src_path = f["tmp_path"]
|
| 217 |
+
else:
|
| 218 |
+
# attempt to read file-like object
|
| 219 |
+
if hasattr(f, "file"):
|
| 220 |
+
# f.file is a SpooledTemporaryFile or similar
|
| 221 |
+
dest = os.path.join(model_dir, getattr(f, "name", "uploaded.bin"))
|
| 222 |
+
with open(dest, "wb") as out_f:
|
| 223 |
+
f.file.seek(0)
|
| 224 |
+
shutil.copyfileobj(f.file, out_f)
|
| 225 |
+
saved.append(dest)
|
| 226 |
+
continue
|
| 227 |
+
# last resort: write bytes attribute if present
|
| 228 |
+
if hasattr(f, "read"):
|
| 229 |
+
dest = os.path.join(model_dir, getattr(f, "name", "uploaded.bin"))
|
| 230 |
+
with open(dest, "wb") as out_f:
|
| 231 |
+
out_f.write(f.read())
|
| 232 |
+
saved.append(dest)
|
| 233 |
+
continue
|
| 234 |
+
raise RuntimeError("Unsupported file object from Gradio upload.")
|
| 235 |
+
if src_path:
|
| 236 |
+
dest = os.path.join(model_dir, os.path.basename(src_path))
|
| 237 |
+
shutil.copy(src_path, dest)
|
| 238 |
+
saved.append(dest)
|
| 239 |
+
except Exception as e:
|
| 240 |
+
errors.append(f"{getattr(f, 'name', str(f))}: {e}")
|
| 241 |
+
|
| 242 |
+
msg = ""
|
| 243 |
+
if saved:
|
| 244 |
+
msg += f"Lưu thành công {len(saved)} tệp: " + ", ".join(os.path.basename(s) for s in saved) + ". "
|
| 245 |
+
if errors:
|
| 246 |
+
msg += "Lỗi: " + "; ".join(errors)
|
| 247 |
+
return msg or "Không có tệp được lưu."
|
| 248 |
+
|
| 249 |
+
|
| 250 |
+
# Reload abstractive summarizer (clear singleton and attempt to reload)
|
| 251 |
+
def reload_abstractive(model_dir: str = DEFAULT_MODEL_DIR):
|
| 252 |
+
global abs_summarizer
|
| 253 |
+
abs_summarizer = None
|
| 254 |
+
try:
|
| 255 |
+
get_abs_summarizer(model_dir=model_dir)
|
| 256 |
+
return "✅ Abstractive model đã được tải thành công."
|
| 257 |
+
except Exception as e:
|
| 258 |
+
return f"❌ Không thể tải abstractive model: {e}"
|
| 259 |
+
|
| 260 |
+
|
| 261 |
+
# Check model status (files exist and try light init)
|
| 262 |
+
def get_model_status(model_dir: str = DEFAULT_MODEL_DIR):
|
| 263 |
+
tok = os.path.join(model_dir, "decoder_tokenizer_re.pkl")
|
| 264 |
+
w = os.path.join(model_dir, "best_model.weights.h5")
|
| 265 |
+
parts = []
|
| 266 |
+
parts.append(f"Model dir: {model_dir}")
|
| 267 |
+
parts.append(f"- Tokenizer: {'OK' if os.path.exists(tok) else 'MISSING'} ({os.path.basename(tok)})")
|
| 268 |
+
parts.append(f"- Weights: {'OK' if os.path.exists(w) else 'MISSING'} ({os.path.basename(w)})")
|
| 269 |
+
# quick attempt to import abstractive to report readiness
|
| 270 |
+
try:
|
| 271 |
+
import_summarizer_module("abstractive")
|
| 272 |
+
parts.append("- Abstractive module: available")
|
| 273 |
+
except Exception as e:
|
| 274 |
+
parts.append(f"- Abstractive module: error ({e})")
|
| 275 |
+
try:
|
| 276 |
+
import_summarizer_module("extractive")
|
| 277 |
+
parts.append("- Extractive module: available")
|
| 278 |
+
except Exception as e:
|
| 279 |
+
parts.append(f"- Extractive module: error ({e})")
|
| 280 |
+
return "\n".join(parts)
|
| 281 |
+
|
| 282 |
+
|
| 283 |
+
# Download text to a temporary file and return path (for Gradio File component)
|
| 284 |
+
def download_text_to_file(text: str, prefix="summary"):
|
| 285 |
+
if not text:
|
| 286 |
+
return None
|
| 287 |
+
fd, path = tempfile.mkstemp(suffix=".txt", prefix=prefix + "_")
|
| 288 |
+
os.close(fd)
|
| 289 |
+
with open(path, "w", encoding="utf-8") as f:
|
| 290 |
+
f.write(text)
|
| 291 |
+
return path
|
| 292 |
+
|
| 293 |
+
|
| 294 |
+
# EXAMPLES (short list to populate example selector)
|
| 295 |
+
EXAMPLES = [
|
| 296 |
+
(
|
| 297 |
+
"Trong bối cảnh công nghệ phát triển mạnh mẽ, trí tuệ nhân tạo (AI) đang dần thay đổi cách thức vận hành của nhiều ngành nghề. "
|
| 298 |
+
"Đặc biệt trong lĩnh vực giáo dục, việc ứng dụng AI giúp cá nhân hóa lộ trình học tập cho từng học sinh, đồng thời hỗ trợ giáo viên "
|
| 299 |
+
"trong việc soạn giảng và đánh giá năng lực. Tuy nhiên, các chuyên gia cũng cảnh báo về những thách thức liên quan đến đạo đức và quyền riêng tư."
|
| 300 |
+
),
|
| 301 |
+
(
|
| 302 |
+
"Giá xăng dầu thế giới tăng mạnh trong tuần qua do căng thẳng địa chính trị. Các chuyên gia cho rằng nguồn cung bị ảnh hưởng bởi việc "
|
| 303 |
+
"giảm xuất khẩu từ một số quốc gia sản xuất lớn. Giá nhiên liệu tăng kéo theo chi phí vận chuyển và giá hàng hóa tăng ở nhiều nơi."
|
| 304 |
+
),
|
| 305 |
+
(
|
| 306 |
+
"Kết luận của đoàn kiểm tra liên ngành (Chi cục An toàn vệ sinh thực phẩm Hà Nội và UBND xã Bình Minh), nêu rõ, bếp ăn đặt tại Trường Tiểu học Cự Khê, xã Bình Minh, Hà Nội, do công ty Nhật Anh phụ trách, vi phạm nghiêm trọng về điều kiện vệ sinh và quy trình triển khai suất ăn cho học sinh. Cụ thể, khu vực nấu ăn, chia thức ăn được bố trí chung với khu vực rửa, có nguy cơ cao gây nhiễm chéo giữa thực phẩm sống và thực phẩm chín. Vệ sinh môi trường kém, hệ thống cống thoát nước trong khu vực chế biến không được che kín, bị ứ đọng, bốc mùi hôi. Một lớp học của Trường Tiểu học Cự Khê trưa 20/10 có lác đác cặp học sinh . Nơi sơ chế, chế biến thức ăn còn có côn trùng. Mặc dù toàn trường có 1.450 suất ăn nhưng chỉ có 2 bàn inox để chia thức ăn, không đáp ứng đủ yêu cầu. Đặc biệt theo kết luận của đoàn kiểm tra, bếp ăn của Công ty Nhật Anh đặt ở Trường Tiểu học Cự khê còn vi phạm quy trình kiểm thực. Cụ thể, nhân viên không thực hiện ghi chép sổ kiểm thực 3 bước trong ngày kiểm tra (16/10). Với những vi phạm trên, đoàn kiểm tra lập biên bản, xử phạt hành chính công ty Nhật Anh 40 triệu đồng. UBND xã Bình Minh sẽ tiếp tục kiểm tra, giám sát chặt chẽ công tác quản lý an toàn thực phẩm của Trường Tiểu học Cự Khê nhằm đảm bảo an toàn tuyệt đối cho học sinh. Học sinh tự mang cơm ăn tại lớp trưa 20/10 . Bên cạnh những vi phạm trên, đơn vị này có một số mặt đạt được như: Có dùng nước sạch, có hợp đồng và phiếu kết quả kiểm nghiệm đạt chuẩn, trang bị dụng cụ thu gom rác thải, xuất trình được hồ sơ chứng minh nguồn gốc xuất xứ của các nguyên liệu thực phẩm. Cũng theo kết luận, tại thời điểm kiểm tra, công ty Nhật Anh đã xuất trình đầy đủ các hồ sơ pháp lý liên quan gồm: Giấy chứng nhận đăng ký kinh doanh/giấy chứng nhận đăng ký doanh nghiệp; giấy chứng nhận cơ sở đủ điều kiện an toàn thực phẩm cho loại hình kinh doanh dịch vụ ăn uống - bếp ăn tập thể; giấy chứng nhận kinh doanh bếp ăn tập thể cho phạm vi chế biến và cung cấp suất ăn công nghiệp… Hiện, Trường Ti��u học Cự Khê đã ban hành thông báo chấm dứt hợp đồng với Công ty TNHH Thương Mại Dịch vụ Xuất nhập khẩu Nhật Anh và tìm đơn vị thay thế. Trả lời phóng viên Dân trí chiều nay, ông Nguyễn Đăng Việt, Chủ tịch UBND xã Bình Minh cho biết, việc cung cấp bếp ăn mới cần chờ thời gian bởi liên quan đến một số quy trình, trong đó đơn vị cung cấp mới cần tiếp quản hoặc thay thế cơ sở vật chất nhà bếp. Thời gian theo quy định của quy trình thay thế bếp mới ít nhất phải 15 ngày. Mặc dù vậy, ông Việt cho hay, UBND xã đang xúc tiến nhanh quy trình để rút ngắn thời gian xuống khoảng một tuần để sớm cung cấp suất ăn cho học sinh. Cũng theo ông Việt, trong thời gian chờ đợi bếp ăn mới, địa phương sẽ huy động bếp ăn các trường học lân cận hỗ trợ suất ăn cho học sinh Trường Tiểu học Cự Khê để phụ huynh không phải đưa đón con buổi trưa hoặc mang cơm tới lớp. Như Dân trí đã phản ánh, sáng nay (20/10), hàng loạt phụ huynh của trường đã cho học sinh nghỉ học vì không thể đón con buổi trưa hoặc để con tự mang cơm đến lớp. Đây là 2 phương án do nhà trường đưa ra để phụ huynh chọn lựa trong thời gian chờ đợi đơn vị cung cấp thực phẩm mới. Tuy nhiên, nhiều phụ huynh tỏ ra bức xúc vì nhà trường không có thông báo cụ thể về thời gian bếp ăn hoạt động trở lại và công tác đảm bảo an toàn thực phẩm cho học sinh. Dân trí sẽ tiếp tục theo dõi sự việc!"
|
| 307 |
+
),
|
| 308 |
+
|
| 309 |
+
]
|
| 310 |
+
|
| 311 |
+
|
| 312 |
+
# Build Gradio interface with improved layout
|
| 313 |
+
with gr.Blocks(theme=gr.themes.Soft(), css="""
|
| 314 |
+
/* Small UI tweaks */
|
| 315 |
+
.header { font-weight:700; font-size:22px; }
|
| 316 |
+
.card { border-radius: 10px; padding: 12px; box-shadow: 0 2px 6px rgba(0,0,0,0.08); }
|
| 317 |
+
.note { font-size: 13px; color: #555; }
|
| 318 |
+
.small { font-size: 12px; color: #666; }
|
| 319 |
+
""") as demo:
|
| 320 |
+
|
| 321 |
+
gr.Markdown("<div class='header'>🇻🇳 Vietnamese Text Summarization — Extractive & Abstractive</div>")
|
| 322 |
+
gr.Markdown("Tùy chỉnh giao diện để dễ dùng trên Hugging Face Spaces. "
|
| 323 |
+
"Upload trọng số & tokenizer vào `models/` nếu muốn bật Abstractive. "
|
| 324 |
+
"Nếu abstractive chưa khả dụng app sẽ báo rõ ràng.")
|
| 325 |
+
|
| 326 |
+
with gr.Row():
|
| 327 |
+
with gr.Column(scale=3):
|
| 328 |
+
article = gr.Textbox(
|
| 329 |
+
label="📝 Văn bản gốc (nhập bài báo hoặc đoạn văn tiếng Việt)",
|
| 330 |
+
lines=12, placeholder="Dán bài báo tiếng Việt vào đây...", show_label=True
|
| 331 |
+
)
|
| 332 |
+
examples = gr.Examples(
|
| 333 |
+
examples=EXAMPLES,
|
| 334 |
+
inputs=[article],
|
| 335 |
+
cache_examples=False
|
| 336 |
+
)
|
| 337 |
+
|
| 338 |
+
with gr.Row():
|
| 339 |
+
generate_ext_btn = gr.Button("🔍 Tạo Extractive", variant="secondary")
|
| 340 |
+
top_n = gr.Slider(label="Số câu (Extractive - top_n)", minimum=1, maximum=6, value=3, step=1)
|
| 341 |
+
download_ext_btn = gr.Button("⬇️ Tải Extractive")
|
| 342 |
+
with gr.Row():
|
| 343 |
+
generate_abs_btn = gr.Button("✨ Tạo Abstractive (Beam Search)", variant="primary")
|
| 344 |
+
beam_k = gr.Slider(label="Beam size (k)", minimum=1, maximum=6, value=3, step=1)
|
| 345 |
+
download_abs_btn = gr.Button("⬇️ Tải Abstractive")
|
| 346 |
+
|
| 347 |
+
gr.Markdown("---")
|
| 348 |
+
ref_box = gr.Textbox(label="📋 (Tùy chọn) Tóm tắt gốc / reference - để so sánh", lines=4)
|
| 349 |
+
|
| 350 |
+
with gr.Row():
|
| 351 |
+
eval_btn = gr.Button("📈 Đánh giá & So sánh (BLEU / ROUGE)")
|
| 352 |
+
eval_plot = gr.Image(label="Biểu đồ so sánh", height=350, interactive=False)
|
| 353 |
+
|
| 354 |
+
with gr.Column(scale=2):
|
| 355 |
+
with gr.Tab("Kết quả Extractive"):
|
| 356 |
+
ext_out = gr.Textbox(label="🟦 Extractive Summary", interactive=False, lines=8)
|
| 357 |
+
ext_file = gr.File(label="Tải tệp Extractive", visible=False)
|
| 358 |
+
with gr.Tab("Kết quả Abstractive"):
|
| 359 |
+
abs_out = gr.Textbox(label="🟪 Abstractive Summary", interactive=False, lines=8)
|
| 360 |
+
abs_file = gr.File(label="Tải tệp Abstractive", visible=False)
|
| 361 |
+
with gr.Tab("Trạng thái & Models"):
|
| 362 |
+
model_status = gr.Textbox(label="Model Status", interactive=False, lines=8, value=get_model_status())
|
| 363 |
+
with gr.Accordion("Upload/Replace model files (models/)", open=False):
|
| 364 |
+
upload_files = gr.Files(label="Chọn file để upload (weights + tokenizer). Ví dụ: best_model.weights.h5, decoder_tokenizer_re.pkl", file_count="multiple")
|
| 365 |
+
upload_btn = gr.Button("⬆️ Upload sang models/")
|
| 366 |
+
reload_btn = gr.Button("🔄 Reload Abstractive Model")
|
| 367 |
+
upload_result = gr.Textbox(label="Kết quả upload", interactive=False, lines=3)
|
| 368 |
+
with gr.Accordion("Tips & Notes (click)", open=False):
|
| 369 |
+
gr.Markdown(
|
| 370 |
+
"- Nếu bạn deploy trên Spaces, upload `best_model.weights.h5` và `decoder_tokenizer_re.pkl` vào `models/`.\n"
|
| 371 |
+
"- VnCoreNLP có thể yêu cầu Java; nếu không sẵn sàng, Extractive sẽ fallback sang tách câu regex.\n"
|
| 372 |
+
"- Abstractive (PhoBERT + custom decoder) cần nhiều RAM/CPU; nếu chậm hãy giảm beam size hoặc chỉ dùng Extractive."
|
| 373 |
+
)
|
| 374 |
+
|
| 375 |
+
# Wiring buttons to functions
|
| 376 |
+
# Generate extractive
|
| 377 |
+
generate_ext_btn.click(
|
| 378 |
+
fn=generate_extractive,
|
| 379 |
+
inputs=[article, top_n, gr.State("")],
|
| 380 |
+
outputs=[ext_out, gr.State("")],
|
| 381 |
+
)
|
| 382 |
+
|
| 383 |
+
# Generate abstractive
|
| 384 |
+
generate_abs_btn.click(
|
| 385 |
+
fn=generate_abstractive,
|
| 386 |
+
inputs=[article, beam_k, gr.State(""), gr.State(DEFAULT_MODEL_DIR)],
|
| 387 |
+
outputs=[abs_out, gr.State("")],
|
| 388 |
+
)
|
| 389 |
+
|
| 390 |
+
# Evaluation
|
| 391 |
+
eval_btn.click(
|
| 392 |
+
fn=evaluate_and_plot,
|
| 393 |
+
inputs=[ref_box, ext_out, abs_out],
|
| 394 |
+
outputs=[eval_plot],
|
| 395 |
+
)
|
| 396 |
+
|
| 397 |
+
# Download ext summary as txt
|
| 398 |
+
def _download_ext(text):
|
| 399 |
+
p = download_text_to_file(text, prefix="extractive")
|
| 400 |
+
return p
|
| 401 |
+
|
| 402 |
+
download_ext_btn.click(fn=_download_ext, inputs=[ext_out], outputs=[ext_file])
|
| 403 |
+
|
| 404 |
+
# Download abs summary as txt
|
| 405 |
+
def _download_abs(text):
|
| 406 |
+
p = download_text_to_file(text, prefix="abstractive")
|
| 407 |
+
return p
|
| 408 |
+
|
| 409 |
+
download_abs_btn.click(fn=_download_abs, inputs=[abs_out], outputs=[abs_file])
|
| 410 |
+
|
| 411 |
+
# Upload model files
|
| 412 |
+
def _upload_and_report(files):
|
| 413 |
+
msg = save_model_files(files, model_dir=DEFAULT_MODEL_DIR)
|
| 414 |
+
status = get_model_status(DEFAULT_MODEL_DIR)
|
| 415 |
+
return msg, status
|
| 416 |
+
|
| 417 |
+
upload_btn.click(fn=_upload_and_report, inputs=[upload_files], outputs=[upload_result, model_status])
|
| 418 |
+
|
| 419 |
+
# Reload abstractive
|
| 420 |
+
reload_btn.click(fn=lambda: reload_abstractive(DEFAULT_MODEL_DIR), inputs=None, outputs=[upload_result])
|
| 421 |
+
|
| 422 |
+
# Periodically show status button (manual)
|
| 423 |
+
def _status_text():
|
| 424 |
+
return get_model_status(DEFAULT_MODEL_DIR)
|
| 425 |
+
|
| 426 |
+
model_status_refresh = gr.Button("🔁 Refresh Status")
|
| 427 |
+
model_status_refresh.click(fn=_status_text, inputs=None, outputs=[model_status])
|
| 428 |
+
|
| 429 |
+
# Footer
|
| 430 |
+
gr.Markdown("---")
|
| 431 |
+
gr.Markdown("Powered by PhoBERT (vinai/phobert-base), TensorFlow and classic TextRank + TF-IDF for extractive.")
|
| 432 |
+
gr.Markdown("If you want help uploading model files to the Hugging Face Hub instead of storing them in the repo, I can provide helper scripts.")
|
| 433 |
+
|
| 434 |
+
if __name__ == "__main__":
|
| 435 |
+
# In Spaces the default host & port are provided by the platform
|
| 436 |
+
demo.launch(share=False, server_name="0.0.0.0", server_port=7860)
|
models/decoder_only.weights.h5
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:c83828ae21f671d04558c1827a24f8eb1806740085a808ae4801b1eb0c17e92e
|
| 3 |
+
size 126786832
|
models/decoder_tokenizer_re.pkl
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:4c46f946199ec3c255f0f10f85090b95d4e2d75400d56654bf58739804a3b26c
|
| 3 |
+
size 261007
|
packages.txt
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
default-jre
|
py/Vietnamese-stopwords.txt
ADDED
|
@@ -0,0 +1,1942 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
a lô
|
| 2 |
+
a ha
|
| 3 |
+
ai
|
| 4 |
+
ai ai
|
| 5 |
+
ai nấy
|
| 6 |
+
ai đó
|
| 7 |
+
alô
|
| 8 |
+
amen
|
| 9 |
+
anh
|
| 10 |
+
anh ấy
|
| 11 |
+
ba
|
| 12 |
+
ba ba
|
| 13 |
+
ba bản
|
| 14 |
+
ba cùng
|
| 15 |
+
ba họ
|
| 16 |
+
ba ngày
|
| 17 |
+
ba ngôi
|
| 18 |
+
ba tăng
|
| 19 |
+
bao giờ
|
| 20 |
+
bao lâu
|
| 21 |
+
bao nhiêu
|
| 22 |
+
bao nả
|
| 23 |
+
bay biến
|
| 24 |
+
biết
|
| 25 |
+
biết bao
|
| 26 |
+
biết bao nhiêu
|
| 27 |
+
biết chắc
|
| 28 |
+
biết chừng nào
|
| 29 |
+
biết mình
|
| 30 |
+
biết mấy
|
| 31 |
+
biết thế
|
| 32 |
+
biết trước
|
| 33 |
+
biết việc
|
| 34 |
+
biết đâu
|
| 35 |
+
biết đâu chừng
|
| 36 |
+
biết đâu đấy
|
| 37 |
+
biết được
|
| 38 |
+
buổi
|
| 39 |
+
buổi làm
|
| 40 |
+
buổi mới
|
| 41 |
+
buổi ngày
|
| 42 |
+
buổi sớm
|
| 43 |
+
bà
|
| 44 |
+
bà ấy
|
| 45 |
+
bài
|
| 46 |
+
bài bác
|
| 47 |
+
bài bỏ
|
| 48 |
+
bài cái
|
| 49 |
+
bác
|
| 50 |
+
bán
|
| 51 |
+
bán cấp
|
| 52 |
+
bán dạ
|
| 53 |
+
bán thế
|
| 54 |
+
bây bẩy
|
| 55 |
+
bây chừ
|
| 56 |
+
bây giờ
|
| 57 |
+
bây nhiêu
|
| 58 |
+
bèn
|
| 59 |
+
béng
|
| 60 |
+
bên
|
| 61 |
+
bên bị
|
| 62 |
+
bên có
|
| 63 |
+
bên cạnh
|
| 64 |
+
bông
|
| 65 |
+
bước
|
| 66 |
+
bước khỏi
|
| 67 |
+
bước tới
|
| 68 |
+
bước đi
|
| 69 |
+
bạn
|
| 70 |
+
bản
|
| 71 |
+
bản bộ
|
| 72 |
+
bản riêng
|
| 73 |
+
bản thân
|
| 74 |
+
bản ý
|
| 75 |
+
bất chợt
|
| 76 |
+
bất cứ
|
| 77 |
+
bất giác
|
| 78 |
+
bất kì
|
| 79 |
+
bất kể
|
| 80 |
+
bất kỳ
|
| 81 |
+
bất luận
|
| 82 |
+
bất ngờ
|
| 83 |
+
bất nhược
|
| 84 |
+
bất quá
|
| 85 |
+
bất quá chỉ
|
| 86 |
+
bất thình lình
|
| 87 |
+
bất tử
|
| 88 |
+
bất đồ
|
| 89 |
+
bấy
|
| 90 |
+
bấy chầy
|
| 91 |
+
bấy chừ
|
| 92 |
+
bấy giờ
|
| 93 |
+
bấy lâu
|
| 94 |
+
bấy lâu nay
|
| 95 |
+
bấy nay
|
| 96 |
+
bấy nhiêu
|
| 97 |
+
bập bà bập bõm
|
| 98 |
+
bập bõm
|
| 99 |
+
bắt đầu
|
| 100 |
+
bắt đầu từ
|
| 101 |
+
bằng
|
| 102 |
+
bằng cứ
|
| 103 |
+
bằng không
|
| 104 |
+
bằng người
|
| 105 |
+
bằng nhau
|
| 106 |
+
bằng như
|
| 107 |
+
bằng nào
|
| 108 |
+
bằng nấy
|
| 109 |
+
bằng vào
|
| 110 |
+
bằng được
|
| 111 |
+
bằng ấy
|
| 112 |
+
bển
|
| 113 |
+
bệt
|
| 114 |
+
bị
|
| 115 |
+
bị chú
|
| 116 |
+
bị vì
|
| 117 |
+
bỏ
|
| 118 |
+
bỏ bà
|
| 119 |
+
bỏ cha
|
| 120 |
+
bỏ cuộc
|
| 121 |
+
bỏ không
|
| 122 |
+
bỏ lại
|
| 123 |
+
bỏ mình
|
| 124 |
+
bỏ mất
|
| 125 |
+
bỏ mẹ
|
| 126 |
+
bỏ nhỏ
|
| 127 |
+
bỏ quá
|
| 128 |
+
bỏ ra
|
| 129 |
+
bỏ riêng
|
| 130 |
+
bỏ việc
|
| 131 |
+
bỏ xa
|
| 132 |
+
bỗng
|
| 133 |
+
bỗng chốc
|
| 134 |
+
bỗng dưng
|
| 135 |
+
bỗng không
|
| 136 |
+
bỗng nhiên
|
| 137 |
+
bỗng nhưng
|
| 138 |
+
bỗng thấy
|
| 139 |
+
bỗng đâu
|
| 140 |
+
bộ
|
| 141 |
+
bộ thuộc
|
| 142 |
+
bộ điều
|
| 143 |
+
bội phần
|
| 144 |
+
bớ
|
| 145 |
+
bởi
|
| 146 |
+
bởi ai
|
| 147 |
+
bởi chưng
|
| 148 |
+
bởi nhưng
|
| 149 |
+
bởi sao
|
| 150 |
+
bởi thế
|
| 151 |
+
bởi thế cho nên
|
| 152 |
+
bởi tại
|
| 153 |
+
bởi vì
|
| 154 |
+
bởi vậy
|
| 155 |
+
bởi đâu
|
| 156 |
+
bức
|
| 157 |
+
cao
|
| 158 |
+
cao lâu
|
| 159 |
+
cao ráo
|
| 160 |
+
cao răng
|
| 161 |
+
cao sang
|
| 162 |
+
cao số
|
| 163 |
+
cao thấp
|
| 164 |
+
cao thế
|
| 165 |
+
cao xa
|
| 166 |
+
cha
|
| 167 |
+
cha chả
|
| 168 |
+
chao ôi
|
| 169 |
+
chia sẻ
|
| 170 |
+
chiếc
|
| 171 |
+
cho
|
| 172 |
+
cho biết
|
| 173 |
+
cho chắc
|
| 174 |
+
cho hay
|
| 175 |
+
cho nhau
|
| 176 |
+
cho nên
|
| 177 |
+
cho rằng
|
| 178 |
+
cho rồi
|
| 179 |
+
cho thấy
|
| 180 |
+
cho tin
|
| 181 |
+
cho tới
|
| 182 |
+
cho tới khi
|
| 183 |
+
cho về
|
| 184 |
+
cho ăn
|
| 185 |
+
cho đang
|
| 186 |
+
cho được
|
| 187 |
+
cho đến
|
| 188 |
+
cho đến khi
|
| 189 |
+
cho đến nỗi
|
| 190 |
+
choa
|
| 191 |
+
chu cha
|
| 192 |
+
chui cha
|
| 193 |
+
chung
|
| 194 |
+
chung cho
|
| 195 |
+
chung chung
|
| 196 |
+
chung cuộc
|
| 197 |
+
chung cục
|
| 198 |
+
chung nhau
|
| 199 |
+
chung qui
|
| 200 |
+
chung quy
|
| 201 |
+
chung quy lại
|
| 202 |
+
chung ái
|
| 203 |
+
chuyển
|
| 204 |
+
chuyển tự
|
| 205 |
+
chuyển đạt
|
| 206 |
+
chuyện
|
| 207 |
+
chuẩn bị
|
| 208 |
+
chành chạnh
|
| 209 |
+
chí chết
|
| 210 |
+
chính
|
| 211 |
+
chính bản
|
| 212 |
+
chính giữa
|
| 213 |
+
chính là
|
| 214 |
+
chính thị
|
| 215 |
+
chính điểm
|
| 216 |
+
chùn chùn
|
| 217 |
+
chùn chũn
|
| 218 |
+
chú
|
| 219 |
+
chú dẫn
|
| 220 |
+
chú khách
|
| 221 |
+
chú mày
|
| 222 |
+
chú mình
|
| 223 |
+
chúng
|
| 224 |
+
chúng mình
|
| 225 |
+
chúng ta
|
| 226 |
+
chúng tôi
|
| 227 |
+
chúng ông
|
| 228 |
+
chăn chắn
|
| 229 |
+
chăng
|
| 230 |
+
chăng chắc
|
| 231 |
+
chăng nữa
|
| 232 |
+
chơi
|
| 233 |
+
chơi họ
|
| 234 |
+
chưa
|
| 235 |
+
chưa bao giờ
|
| 236 |
+
chưa chắc
|
| 237 |
+
chưa có
|
| 238 |
+
chưa cần
|
| 239 |
+
chưa dùng
|
| 240 |
+
chưa dễ
|
| 241 |
+
chưa kể
|
| 242 |
+
chưa tính
|
| 243 |
+
chưa từng
|
| 244 |
+
chầm chập
|
| 245 |
+
chậc
|
| 246 |
+
chắc
|
| 247 |
+
chắc chắn
|
| 248 |
+
chắc dạ
|
| 249 |
+
chắc hẳn
|
| 250 |
+
chắc lòng
|
| 251 |
+
chắc người
|
| 252 |
+
chắc vào
|
| 253 |
+
chắc ăn
|
| 254 |
+
chẳng lẽ
|
| 255 |
+
chẳng những
|
| 256 |
+
chẳng nữa
|
| 257 |
+
chẳng phải
|
| 258 |
+
chết nỗi
|
| 259 |
+
chết thật
|
| 260 |
+
chết tiệt
|
| 261 |
+
chỉ
|
| 262 |
+
chỉ chính
|
| 263 |
+
chỉ có
|
| 264 |
+
chỉ là
|
| 265 |
+
chỉ tên
|
| 266 |
+
chỉn
|
| 267 |
+
chị
|
| 268 |
+
chị bộ
|
| 269 |
+
chị ấy
|
| 270 |
+
chịu
|
| 271 |
+
chịu chưa
|
| 272 |
+
chịu lời
|
| 273 |
+
chịu tốt
|
| 274 |
+
chịu ăn
|
| 275 |
+
chọn
|
| 276 |
+
chọn bên
|
| 277 |
+
chọn ra
|
| 278 |
+
chốc chốc
|
| 279 |
+
chớ
|
| 280 |
+
chớ chi
|
| 281 |
+
chớ gì
|
| 282 |
+
chớ không
|
| 283 |
+
chớ kể
|
| 284 |
+
chớ như
|
| 285 |
+
chợt
|
| 286 |
+
chợt nghe
|
| 287 |
+
chợt nhìn
|
| 288 |
+
chủn
|
| 289 |
+
chứ
|
| 290 |
+
chứ ai
|
| 291 |
+
chứ còn
|
| 292 |
+
chứ gì
|
| 293 |
+
chứ không
|
| 294 |
+
chứ không phải
|
| 295 |
+
chứ lại
|
| 296 |
+
chứ lị
|
| 297 |
+
chứ như
|
| 298 |
+
chứ sao
|
| 299 |
+
coi bộ
|
| 300 |
+
coi mòi
|
| 301 |
+
con
|
| 302 |
+
con con
|
| 303 |
+
con dạ
|
| 304 |
+
con nhà
|
| 305 |
+
con tính
|
| 306 |
+
cu cậu
|
| 307 |
+
cuối
|
| 308 |
+
cuối cùng
|
| 309 |
+
cuối điểm
|
| 310 |
+
cuốn
|
| 311 |
+
cuộc
|
| 312 |
+
càng
|
| 313 |
+
càng càng
|
| 314 |
+
càng hay
|
| 315 |
+
cá nhân
|
| 316 |
+
các
|
| 317 |
+
các cậu
|
| 318 |
+
cách
|
| 319 |
+
cách bức
|
| 320 |
+
cách không
|
| 321 |
+
cách nhau
|
| 322 |
+
cách đều
|
| 323 |
+
cái
|
| 324 |
+
cái gì
|
| 325 |
+
cái họ
|
| 326 |
+
cái đã
|
| 327 |
+
cái đó
|
| 328 |
+
cái ấy
|
| 329 |
+
câu hỏi
|
| 330 |
+
cây
|
| 331 |
+
cây nước
|
| 332 |
+
còn
|
| 333 |
+
còn như
|
| 334 |
+
còn nữa
|
| 335 |
+
còn thời gian
|
| 336 |
+
còn về
|
| 337 |
+
có
|
| 338 |
+
có ai
|
| 339 |
+
có chuyện
|
| 340 |
+
có chăng
|
| 341 |
+
có chăng là
|
| 342 |
+
có chứ
|
| 343 |
+
có cơ
|
| 344 |
+
có dễ
|
| 345 |
+
có họ
|
| 346 |
+
có khi
|
| 347 |
+
có ngày
|
| 348 |
+
có người
|
| 349 |
+
có nhiều
|
| 350 |
+
có nhà
|
| 351 |
+
có phải
|
| 352 |
+
có số
|
| 353 |
+
có tháng
|
| 354 |
+
có thế
|
| 355 |
+
có thể
|
| 356 |
+
có vẻ
|
| 357 |
+
có ý
|
| 358 |
+
có ăn
|
| 359 |
+
có điều
|
| 360 |
+
có điều kiện
|
| 361 |
+
có đáng
|
| 362 |
+
có đâu
|
| 363 |
+
có được
|
| 364 |
+
cóc khô
|
| 365 |
+
cô
|
| 366 |
+
cô mình
|
| 367 |
+
cô quả
|
| 368 |
+
cô tăng
|
| 369 |
+
cô ấy
|
| 370 |
+
công nhiên
|
| 371 |
+
cùng
|
| 372 |
+
cùng chung
|
| 373 |
+
cùng cực
|
| 374 |
+
cùng nhau
|
| 375 |
+
cùng tuổi
|
| 376 |
+
cùng tột
|
| 377 |
+
cùng với
|
| 378 |
+
cùng ăn
|
| 379 |
+
căn
|
| 380 |
+
căn cái
|
| 381 |
+
căn cắt
|
| 382 |
+
căn tính
|
| 383 |
+
cũng
|
| 384 |
+
cũng như
|
| 385 |
+
cũng nên
|
| 386 |
+
cũng thế
|
| 387 |
+
cũng vậy
|
| 388 |
+
cũng vậy thôi
|
| 389 |
+
cũng được
|
| 390 |
+
cơ
|
| 391 |
+
cơ chỉ
|
| 392 |
+
cơ chừng
|
| 393 |
+
cơ cùng
|
| 394 |
+
cơ dẫn
|
| 395 |
+
cơ hồ
|
| 396 |
+
cơ hội
|
| 397 |
+
cơ mà
|
| 398 |
+
cơn
|
| 399 |
+
cả
|
| 400 |
+
cả nghe
|
| 401 |
+
cả nghĩ
|
| 402 |
+
cả ngày
|
| 403 |
+
cả người
|
| 404 |
+
cả nhà
|
| 405 |
+
cả năm
|
| 406 |
+
cả thảy
|
| 407 |
+
cả thể
|
| 408 |
+
cả tin
|
| 409 |
+
cả ăn
|
| 410 |
+
cả đến
|
| 411 |
+
cảm thấy
|
| 412 |
+
cảm ơn
|
| 413 |
+
cấp
|
| 414 |
+
cấp số
|
| 415 |
+
cấp trực tiếp
|
| 416 |
+
cần
|
| 417 |
+
cần cấp
|
| 418 |
+
cần gì
|
| 419 |
+
cần số
|
| 420 |
+
cật lực
|
| 421 |
+
cật sức
|
| 422 |
+
cậu
|
| 423 |
+
cổ lai
|
| 424 |
+
cụ thể
|
| 425 |
+
cụ thể là
|
| 426 |
+
cụ thể như
|
| 427 |
+
của
|
| 428 |
+
của ngọt
|
| 429 |
+
của tin
|
| 430 |
+
cứ
|
| 431 |
+
cứ như
|
| 432 |
+
cứ việc
|
| 433 |
+
cứ điểm
|
| 434 |
+
cực lực
|
| 435 |
+
do
|
| 436 |
+
do vì
|
| 437 |
+
do vậy
|
| 438 |
+
do đó
|
| 439 |
+
duy
|
| 440 |
+
duy chỉ
|
| 441 |
+
duy có
|
| 442 |
+
dài
|
| 443 |
+
dài lời
|
| 444 |
+
dài ra
|
| 445 |
+
dành
|
| 446 |
+
dành dành
|
| 447 |
+
dào
|
| 448 |
+
dì
|
| 449 |
+
dù
|
| 450 |
+
dù cho
|
| 451 |
+
dù dì
|
| 452 |
+
dù gì
|
| 453 |
+
dù rằng
|
| 454 |
+
dù sao
|
| 455 |
+
dùng
|
| 456 |
+
dùng cho
|
| 457 |
+
dùng hết
|
| 458 |
+
dùng làm
|
| 459 |
+
dùng đến
|
| 460 |
+
dưới
|
| 461 |
+
dưới nước
|
| 462 |
+
dạ
|
| 463 |
+
dạ bán
|
| 464 |
+
dạ con
|
| 465 |
+
dạ dài
|
| 466 |
+
dạ dạ
|
| 467 |
+
dạ khách
|
| 468 |
+
dần dà
|
| 469 |
+
dần dần
|
| 470 |
+
dầu sao
|
| 471 |
+
dẫn
|
| 472 |
+
dẫu
|
| 473 |
+
dẫu mà
|
| 474 |
+
dẫu rằng
|
| 475 |
+
dẫu sao
|
| 476 |
+
dễ
|
| 477 |
+
dễ dùng
|
| 478 |
+
dễ gì
|
| 479 |
+
dễ khiến
|
| 480 |
+
dễ nghe
|
| 481 |
+
dễ ngươi
|
| 482 |
+
dễ như chơi
|
| 483 |
+
dễ sợ
|
| 484 |
+
dễ sử dụng
|
| 485 |
+
dễ thường
|
| 486 |
+
dễ thấy
|
| 487 |
+
dễ ăn
|
| 488 |
+
dễ đâu
|
| 489 |
+
dở chừng
|
| 490 |
+
dữ
|
| 491 |
+
dữ cách
|
| 492 |
+
em
|
| 493 |
+
em em
|
| 494 |
+
giá trị
|
| 495 |
+
giá trị thực tế
|
| 496 |
+
giảm
|
| 497 |
+
giảm chính
|
| 498 |
+
giảm thấp
|
| 499 |
+
giảm thế
|
| 500 |
+
giống
|
| 501 |
+
giống người
|
| 502 |
+
giống nhau
|
| 503 |
+
giống như
|
| 504 |
+
giờ
|
| 505 |
+
giờ lâu
|
| 506 |
+
giờ này
|
| 507 |
+
giờ đi
|
| 508 |
+
giờ đây
|
| 509 |
+
giờ đến
|
| 510 |
+
giữ
|
| 511 |
+
giữ lấy
|
| 512 |
+
giữ ý
|
| 513 |
+
giữa
|
| 514 |
+
giữa lúc
|
| 515 |
+
gây
|
| 516 |
+
gây cho
|
| 517 |
+
gây giống
|
| 518 |
+
gây ra
|
| 519 |
+
gây thêm
|
| 520 |
+
gì
|
| 521 |
+
gì gì
|
| 522 |
+
gì đó
|
| 523 |
+
gần
|
| 524 |
+
gần bên
|
| 525 |
+
gần hết
|
| 526 |
+
gần ngày
|
| 527 |
+
gần như
|
| 528 |
+
gần xa
|
| 529 |
+
gần đây
|
| 530 |
+
gần đến
|
| 531 |
+
gặp
|
| 532 |
+
gặp khó khăn
|
| 533 |
+
gặp phải
|
| 534 |
+
gồm
|
| 535 |
+
hay
|
| 536 |
+
hay biết
|
| 537 |
+
hay hay
|
| 538 |
+
hay không
|
| 539 |
+
hay là
|
| 540 |
+
hay làm
|
| 541 |
+
hay nhỉ
|
| 542 |
+
hay nói
|
| 543 |
+
hay sao
|
| 544 |
+
hay tin
|
| 545 |
+
hay đâu
|
| 546 |
+
hiểu
|
| 547 |
+
hiện nay
|
| 548 |
+
hiện tại
|
| 549 |
+
hoàn toàn
|
| 550 |
+
hoặc
|
| 551 |
+
hoặc là
|
| 552 |
+
hãy
|
| 553 |
+
hãy còn
|
| 554 |
+
hơn
|
| 555 |
+
hơn cả
|
| 556 |
+
hơn hết
|
| 557 |
+
hơn là
|
| 558 |
+
hơn nữa
|
| 559 |
+
hơn trước
|
| 560 |
+
hầu hết
|
| 561 |
+
hết
|
| 562 |
+
hết chuyện
|
| 563 |
+
hết cả
|
| 564 |
+
hết của
|
| 565 |
+
hết nói
|
| 566 |
+
hết ráo
|
| 567 |
+
hết rồi
|
| 568 |
+
hết ý
|
| 569 |
+
họ
|
| 570 |
+
họ gần
|
| 571 |
+
họ xa
|
| 572 |
+
hỏi
|
| 573 |
+
hỏi lại
|
| 574 |
+
hỏi xem
|
| 575 |
+
hỏi xin
|
| 576 |
+
hỗ trợ
|
| 577 |
+
khi
|
| 578 |
+
khi khác
|
| 579 |
+
khi không
|
| 580 |
+
khi nào
|
| 581 |
+
khi nên
|
| 582 |
+
khi trước
|
| 583 |
+
khiến
|
| 584 |
+
khoảng
|
| 585 |
+
khoảng cách
|
| 586 |
+
khoảng không
|
| 587 |
+
khá
|
| 588 |
+
khá tốt
|
| 589 |
+
khác
|
| 590 |
+
khác gì
|
| 591 |
+
khác khác
|
| 592 |
+
khác nhau
|
| 593 |
+
khác nào
|
| 594 |
+
khác thường
|
| 595 |
+
khác xa
|
| 596 |
+
khách
|
| 597 |
+
khó
|
| 598 |
+
khó biết
|
| 599 |
+
khó chơi
|
| 600 |
+
khó khăn
|
| 601 |
+
khó làm
|
| 602 |
+
khó mở
|
| 603 |
+
khó nghe
|
| 604 |
+
khó nghĩ
|
| 605 |
+
khó nói
|
| 606 |
+
khó thấy
|
| 607 |
+
khó tránh
|
| 608 |
+
không
|
| 609 |
+
không ai
|
| 610 |
+
không bao giờ
|
| 611 |
+
không bao lâu
|
| 612 |
+
không biết
|
| 613 |
+
không bán
|
| 614 |
+
không chỉ
|
| 615 |
+
không còn
|
| 616 |
+
không có
|
| 617 |
+
không có gì
|
| 618 |
+
không cùng
|
| 619 |
+
không cần
|
| 620 |
+
không cứ
|
| 621 |
+
không dùng
|
| 622 |
+
không gì
|
| 623 |
+
không hay
|
| 624 |
+
không khỏi
|
| 625 |
+
không kể
|
| 626 |
+
không ngoài
|
| 627 |
+
không nhận
|
| 628 |
+
không những
|
| 629 |
+
không phải
|
| 630 |
+
không phải không
|
| 631 |
+
không thể
|
| 632 |
+
không tính
|
| 633 |
+
không điều kiện
|
| 634 |
+
không được
|
| 635 |
+
không đầy
|
| 636 |
+
không để
|
| 637 |
+
khẳng định
|
| 638 |
+
khỏi
|
| 639 |
+
khỏi nói
|
| 640 |
+
kể
|
| 641 |
+
kể cả
|
| 642 |
+
kể như
|
| 643 |
+
kể tới
|
| 644 |
+
kể từ
|
| 645 |
+
liên quan
|
| 646 |
+
loại
|
| 647 |
+
loại từ
|
| 648 |
+
luôn
|
| 649 |
+
luôn cả
|
| 650 |
+
luôn luôn
|
| 651 |
+
luôn tay
|
| 652 |
+
là
|
| 653 |
+
là cùng
|
| 654 |
+
là là
|
| 655 |
+
là nhiều
|
| 656 |
+
là phải
|
| 657 |
+
là thế nào
|
| 658 |
+
là vì
|
| 659 |
+
là ít
|
| 660 |
+
làm
|
| 661 |
+
làm bằng
|
| 662 |
+
làm cho
|
| 663 |
+
làm dần dần
|
| 664 |
+
làm gì
|
| 665 |
+
làm lòng
|
| 666 |
+
làm lại
|
| 667 |
+
làm lấy
|
| 668 |
+
làm mất
|
| 669 |
+
làm ngay
|
| 670 |
+
làm như
|
| 671 |
+
làm nên
|
| 672 |
+
làm ra
|
| 673 |
+
làm riêng
|
| 674 |
+
làm sao
|
| 675 |
+
làm theo
|
| 676 |
+
làm thế nào
|
| 677 |
+
làm tin
|
| 678 |
+
làm tôi
|
| 679 |
+
làm tăng
|
| 680 |
+
làm tại
|
| 681 |
+
làm tắp lự
|
| 682 |
+
làm vì
|
| 683 |
+
làm đúng
|
| 684 |
+
làm được
|
| 685 |
+
lâu
|
| 686 |
+
lâu các
|
| 687 |
+
lâu lâu
|
| 688 |
+
lâu nay
|
| 689 |
+
lâu ngày
|
| 690 |
+
lên
|
| 691 |
+
lên cao
|
| 692 |
+
lên cơn
|
| 693 |
+
lên mạnh
|
| 694 |
+
lên ngôi
|
| 695 |
+
lên nước
|
| 696 |
+
lên số
|
| 697 |
+
lên xuống
|
| 698 |
+
lên đến
|
| 699 |
+
lòng
|
| 700 |
+
lòng không
|
| 701 |
+
lúc
|
| 702 |
+
lúc khác
|
| 703 |
+
lúc lâu
|
| 704 |
+
lúc nào
|
| 705 |
+
lúc này
|
| 706 |
+
lúc sáng
|
| 707 |
+
lúc trước
|
| 708 |
+
lúc đi
|
| 709 |
+
lúc đó
|
| 710 |
+
lúc đến
|
| 711 |
+
lúc ấy
|
| 712 |
+
lý do
|
| 713 |
+
lượng
|
| 714 |
+
lượng cả
|
| 715 |
+
lượng số
|
| 716 |
+
lượng từ
|
| 717 |
+
lại
|
| 718 |
+
lại bộ
|
| 719 |
+
lại cái
|
| 720 |
+
lại còn
|
| 721 |
+
lại giống
|
| 722 |
+
lại làm
|
| 723 |
+
lại người
|
| 724 |
+
lại nói
|
| 725 |
+
lại nữa
|
| 726 |
+
lại quả
|
| 727 |
+
lại thôi
|
| 728 |
+
lại ăn
|
| 729 |
+
lại đây
|
| 730 |
+
lấy
|
| 731 |
+
lấy có
|
| 732 |
+
lấy cả
|
| 733 |
+
lấy giống
|
| 734 |
+
lấy làm
|
| 735 |
+
lấy lý do
|
| 736 |
+
lấy lại
|
| 737 |
+
lấy ra
|
| 738 |
+
lấy ráo
|
| 739 |
+
lấy sau
|
| 740 |
+
lấy số
|
| 741 |
+
lấy thêm
|
| 742 |
+
lấy thế
|
| 743 |
+
lấy vào
|
| 744 |
+
lấy xuống
|
| 745 |
+
lấy được
|
| 746 |
+
lấy để
|
| 747 |
+
lần
|
| 748 |
+
lần khác
|
| 749 |
+
lần lần
|
| 750 |
+
lần nào
|
| 751 |
+
lần này
|
| 752 |
+
lần sang
|
| 753 |
+
lần sau
|
| 754 |
+
lần theo
|
| 755 |
+
lần trước
|
| 756 |
+
lần tìm
|
| 757 |
+
lớn
|
| 758 |
+
lớn lên
|
| 759 |
+
lớn nhỏ
|
| 760 |
+
lời
|
| 761 |
+
lời chú
|
| 762 |
+
lời nói
|
| 763 |
+
mang
|
| 764 |
+
mang lại
|
| 765 |
+
mang mang
|
| 766 |
+
mang nặng
|
| 767 |
+
mang về
|
| 768 |
+
muốn
|
| 769 |
+
mà
|
| 770 |
+
mà cả
|
| 771 |
+
mà không
|
| 772 |
+
mà lại
|
| 773 |
+
mà thôi
|
| 774 |
+
mà vẫn
|
| 775 |
+
mình
|
| 776 |
+
mạnh
|
| 777 |
+
mất
|
| 778 |
+
mất còn
|
| 779 |
+
mọi
|
| 780 |
+
mọi giờ
|
| 781 |
+
mọi khi
|
| 782 |
+
mọi lúc
|
| 783 |
+
mọi người
|
| 784 |
+
mọi nơi
|
| 785 |
+
mọi sự
|
| 786 |
+
mọi thứ
|
| 787 |
+
mọi việc
|
| 788 |
+
mối
|
| 789 |
+
mỗi
|
| 790 |
+
mỗi lúc
|
| 791 |
+
mỗi lần
|
| 792 |
+
mỗi một
|
| 793 |
+
mỗi ngày
|
| 794 |
+
mỗi người
|
| 795 |
+
một
|
| 796 |
+
một cách
|
| 797 |
+
một cơn
|
| 798 |
+
một khi
|
| 799 |
+
một lúc
|
| 800 |
+
một số
|
| 801 |
+
một vài
|
| 802 |
+
một ít
|
| 803 |
+
mới
|
| 804 |
+
mới hay
|
| 805 |
+
mới rồi
|
| 806 |
+
mới đây
|
| 807 |
+
mở
|
| 808 |
+
mở mang
|
| 809 |
+
mở nước
|
| 810 |
+
mở ra
|
| 811 |
+
mợ
|
| 812 |
+
mức
|
| 813 |
+
nay
|
| 814 |
+
ngay
|
| 815 |
+
ngay bây giờ
|
| 816 |
+
ngay cả
|
| 817 |
+
ngay khi
|
| 818 |
+
ngay khi đến
|
| 819 |
+
ngay lúc
|
| 820 |
+
ngay lúc này
|
| 821 |
+
ngay lập tức
|
| 822 |
+
ngay thật
|
| 823 |
+
ngay tức khắc
|
| 824 |
+
ngay tức thì
|
| 825 |
+
ngay từ
|
| 826 |
+
nghe
|
| 827 |
+
nghe chừng
|
| 828 |
+
nghe hiểu
|
| 829 |
+
nghe không
|
| 830 |
+
nghe lại
|
| 831 |
+
nghe nhìn
|
| 832 |
+
nghe như
|
| 833 |
+
nghe nói
|
| 834 |
+
nghe ra
|
| 835 |
+
nghe rõ
|
| 836 |
+
nghe thấy
|
| 837 |
+
nghe tin
|
| 838 |
+
nghe trực tiếp
|
| 839 |
+
nghe đâu
|
| 840 |
+
nghe đâu như
|
| 841 |
+
nghe được
|
| 842 |
+
nghen
|
| 843 |
+
nghiễm nhiên
|
| 844 |
+
nghĩ
|
| 845 |
+
nghĩ lại
|
| 846 |
+
nghĩ ra
|
| 847 |
+
nghĩ tới
|
| 848 |
+
nghĩ xa
|
| 849 |
+
nghĩ đến
|
| 850 |
+
nghỉm
|
| 851 |
+
ngoài
|
| 852 |
+
ngoài này
|
| 853 |
+
ngoài ra
|
| 854 |
+
ngoài xa
|
| 855 |
+
ngoải
|
| 856 |
+
nguồn
|
| 857 |
+
ngày
|
| 858 |
+
ngày càng
|
| 859 |
+
ngày cấp
|
| 860 |
+
ngày giờ
|
| 861 |
+
ngày ngày
|
| 862 |
+
ngày nào
|
| 863 |
+
ngày này
|
| 864 |
+
ngày nọ
|
| 865 |
+
ngày qua
|
| 866 |
+
ngày rày
|
| 867 |
+
ngày tháng
|
| 868 |
+
ngày xưa
|
| 869 |
+
ngày xửa
|
| 870 |
+
ngày đến
|
| 871 |
+
ngày ấy
|
| 872 |
+
ngôi
|
| 873 |
+
ngôi nhà
|
| 874 |
+
ngôi thứ
|
| 875 |
+
ngõ hầu
|
| 876 |
+
ngăn ngắt
|
| 877 |
+
ngươi
|
| 878 |
+
người
|
| 879 |
+
người hỏi
|
| 880 |
+
người khác
|
| 881 |
+
người khách
|
| 882 |
+
người mình
|
| 883 |
+
người nghe
|
| 884 |
+
người người
|
| 885 |
+
người nhận
|
| 886 |
+
ngọn
|
| 887 |
+
ngọn nguồn
|
| 888 |
+
ngọt
|
| 889 |
+
ngồi
|
| 890 |
+
ngồi bệt
|
| 891 |
+
ngồi không
|
| 892 |
+
ngồi sau
|
| 893 |
+
ngồi trệt
|
| 894 |
+
ngộ nhỡ
|
| 895 |
+
nhanh
|
| 896 |
+
nhanh lên
|
| 897 |
+
nhanh tay
|
| 898 |
+
nhau
|
| 899 |
+
nhiên hậu
|
| 900 |
+
nhiều
|
| 901 |
+
nhiều ít
|
| 902 |
+
nhiệt liệt
|
| 903 |
+
nhung nhăng
|
| 904 |
+
nhà
|
| 905 |
+
nhà chung
|
| 906 |
+
nhà khó
|
| 907 |
+
nhà làm
|
| 908 |
+
nhà ngoài
|
| 909 |
+
nhà ngươi
|
| 910 |
+
nhà tôi
|
| 911 |
+
nhà việc
|
| 912 |
+
nhân dịp
|
| 913 |
+
nhân tiện
|
| 914 |
+
nhé
|
| 915 |
+
nhìn
|
| 916 |
+
nhìn chung
|
| 917 |
+
nhìn lại
|
| 918 |
+
nhìn nhận
|
| 919 |
+
nhìn theo
|
| 920 |
+
nhìn thấy
|
| 921 |
+
nhìn xuống
|
| 922 |
+
nhóm
|
| 923 |
+
nhón nhén
|
| 924 |
+
như
|
| 925 |
+
như ai
|
| 926 |
+
như chơi
|
| 927 |
+
như không
|
| 928 |
+
như là
|
| 929 |
+
như nhau
|
| 930 |
+
như quả
|
| 931 |
+
như sau
|
| 932 |
+
như thường
|
| 933 |
+
như thế
|
| 934 |
+
như thế nào
|
| 935 |
+
như thể
|
| 936 |
+
như trên
|
| 937 |
+
như trước
|
| 938 |
+
như tuồng
|
| 939 |
+
như vậy
|
| 940 |
+
như ý
|
| 941 |
+
nhưng
|
| 942 |
+
nhưng mà
|
| 943 |
+
nhược bằng
|
| 944 |
+
nhất
|
| 945 |
+
nhất loạt
|
| 946 |
+
nhất luật
|
| 947 |
+
nhất là
|
| 948 |
+
nhất mực
|
| 949 |
+
nhất nhất
|
| 950 |
+
nhất quyết
|
| 951 |
+
nhất sinh
|
| 952 |
+
nhất thiết
|
| 953 |
+
nhất thì
|
| 954 |
+
nhất tâm
|
| 955 |
+
nhất tề
|
| 956 |
+
nhất đán
|
| 957 |
+
nhất định
|
| 958 |
+
nhận
|
| 959 |
+
nhận biết
|
| 960 |
+
nhận họ
|
| 961 |
+
nhận làm
|
| 962 |
+
nhận nhau
|
| 963 |
+
nhận ra
|
| 964 |
+
nhận thấy
|
| 965 |
+
nhận việc
|
| 966 |
+
nhận được
|
| 967 |
+
nhằm
|
| 968 |
+
nhằm khi
|
| 969 |
+
nhằm lúc
|
| 970 |
+
nhằm vào
|
| 971 |
+
nhằm để
|
| 972 |
+
nhỉ
|
| 973 |
+
nhỏ
|
| 974 |
+
nhỏ người
|
| 975 |
+
nhớ
|
| 976 |
+
nhớ bập bõm
|
| 977 |
+
nhớ lại
|
| 978 |
+
nhớ lấy
|
| 979 |
+
nhớ ra
|
| 980 |
+
nhờ
|
| 981 |
+
nhờ chuyển
|
| 982 |
+
nhờ có
|
| 983 |
+
nhờ nhờ
|
| 984 |
+
nhờ đó
|
| 985 |
+
nhỡ ra
|
| 986 |
+
những
|
| 987 |
+
những ai
|
| 988 |
+
những khi
|
| 989 |
+
những là
|
| 990 |
+
những lúc
|
| 991 |
+
những muốn
|
| 992 |
+
những như
|
| 993 |
+
nào
|
| 994 |
+
nào cũng
|
| 995 |
+
nào hay
|
| 996 |
+
nào là
|
| 997 |
+
nào phải
|
| 998 |
+
nào đâu
|
| 999 |
+
nào đó
|
| 1000 |
+
này
|
| 1001 |
+
này nọ
|
| 1002 |
+
nên
|
| 1003 |
+
nên chi
|
| 1004 |
+
nên chăng
|
| 1005 |
+
nên làm
|
| 1006 |
+
nên người
|
| 1007 |
+
nên tránh
|
| 1008 |
+
nó
|
| 1009 |
+
nóc
|
| 1010 |
+
nói
|
| 1011 |
+
nói bông
|
| 1012 |
+
nói chung
|
| 1013 |
+
nói khó
|
| 1014 |
+
nói là
|
| 1015 |
+
nói lên
|
| 1016 |
+
nói lại
|
| 1017 |
+
nói nhỏ
|
| 1018 |
+
nói phải
|
| 1019 |
+
nói qua
|
| 1020 |
+
nói ra
|
| 1021 |
+
nói riêng
|
| 1022 |
+
nói rõ
|
| 1023 |
+
nói thêm
|
| 1024 |
+
nói thật
|
| 1025 |
+
nói toẹt
|
| 1026 |
+
nói trước
|
| 1027 |
+
nói tốt
|
| 1028 |
+
nói với
|
| 1029 |
+
nói xa
|
| 1030 |
+
nói ý
|
| 1031 |
+
nói đến
|
| 1032 |
+
nói đủ
|
| 1033 |
+
năm
|
| 1034 |
+
năm tháng
|
| 1035 |
+
nơi
|
| 1036 |
+
nơi nơi
|
| 1037 |
+
nước
|
| 1038 |
+
nước bài
|
| 1039 |
+
nước cùng
|
| 1040 |
+
nước lên
|
| 1041 |
+
nước nặng
|
| 1042 |
+
nước quả
|
| 1043 |
+
nước xuống
|
| 1044 |
+
nước ăn
|
| 1045 |
+
nước đến
|
| 1046 |
+
nấy
|
| 1047 |
+
nặng
|
| 1048 |
+
nặng căn
|
| 1049 |
+
nặng mình
|
| 1050 |
+
nặng về
|
| 1051 |
+
nếu
|
| 1052 |
+
nếu có
|
| 1053 |
+
nếu cần
|
| 1054 |
+
nếu không
|
| 1055 |
+
nếu mà
|
| 1056 |
+
nếu như
|
| 1057 |
+
nếu thế
|
| 1058 |
+
nếu vậy
|
| 1059 |
+
nếu được
|
| 1060 |
+
nền
|
| 1061 |
+
nọ
|
| 1062 |
+
nớ
|
| 1063 |
+
nức nở
|
| 1064 |
+
nữa
|
| 1065 |
+
nữa khi
|
| 1066 |
+
nữa là
|
| 1067 |
+
nữa rồi
|
| 1068 |
+
oai oái
|
| 1069 |
+
oái
|
| 1070 |
+
pho
|
| 1071 |
+
phè
|
| 1072 |
+
phè phè
|
| 1073 |
+
phía
|
| 1074 |
+
phía bên
|
| 1075 |
+
phía bạn
|
| 1076 |
+
phía dưới
|
| 1077 |
+
phía sau
|
| 1078 |
+
phía trong
|
| 1079 |
+
phía trên
|
| 1080 |
+
phía trước
|
| 1081 |
+
phóc
|
| 1082 |
+
phót
|
| 1083 |
+
phù hợp
|
| 1084 |
+
phăn phắt
|
| 1085 |
+
phương chi
|
| 1086 |
+
phải
|
| 1087 |
+
phải biết
|
| 1088 |
+
phải chi
|
| 1089 |
+
phải chăng
|
| 1090 |
+
phải cách
|
| 1091 |
+
phải cái
|
| 1092 |
+
phải giờ
|
| 1093 |
+
phải khi
|
| 1094 |
+
phải không
|
| 1095 |
+
phải lại
|
| 1096 |
+
phải lời
|
| 1097 |
+
phải người
|
| 1098 |
+
phải như
|
| 1099 |
+
phải rồi
|
| 1100 |
+
phải tay
|
| 1101 |
+
phần
|
| 1102 |
+
phần lớn
|
| 1103 |
+
phần nhiều
|
| 1104 |
+
phần nào
|
| 1105 |
+
phần sau
|
| 1106 |
+
phần việc
|
| 1107 |
+
phắt
|
| 1108 |
+
phỉ phui
|
| 1109 |
+
phỏng
|
| 1110 |
+
phỏng như
|
| 1111 |
+
phỏng nước
|
| 1112 |
+
phỏng theo
|
| 1113 |
+
phỏng tính
|
| 1114 |
+
phốc
|
| 1115 |
+
phụt
|
| 1116 |
+
phứt
|
| 1117 |
+
qua
|
| 1118 |
+
qua chuyện
|
| 1119 |
+
qua khỏi
|
| 1120 |
+
qua lại
|
| 1121 |
+
qua lần
|
| 1122 |
+
qua ngày
|
| 1123 |
+
qua tay
|
| 1124 |
+
qua thì
|
| 1125 |
+
qua đi
|
| 1126 |
+
quan trọng
|
| 1127 |
+
quan trọng vấn đề
|
| 1128 |
+
quan tâm
|
| 1129 |
+
quay
|
| 1130 |
+
quay bước
|
| 1131 |
+
quay lại
|
| 1132 |
+
quay số
|
| 1133 |
+
quay đi
|
| 1134 |
+
quá
|
| 1135 |
+
quá bán
|
| 1136 |
+
quá bộ
|
| 1137 |
+
quá giờ
|
| 1138 |
+
quá lời
|
| 1139 |
+
quá mức
|
| 1140 |
+
quá nhiều
|
| 1141 |
+
quá tay
|
| 1142 |
+
quá thì
|
| 1143 |
+
quá tin
|
| 1144 |
+
quá trình
|
| 1145 |
+
quá tuổi
|
| 1146 |
+
quá đáng
|
| 1147 |
+
quá ư
|
| 1148 |
+
quả
|
| 1149 |
+
quả là
|
| 1150 |
+
quả thật
|
| 1151 |
+
quả thế
|
| 1152 |
+
quả vậy
|
| 1153 |
+
quận
|
| 1154 |
+
ra
|
| 1155 |
+
ra bài
|
| 1156 |
+
ra bộ
|
| 1157 |
+
ra chơi
|
| 1158 |
+
ra gì
|
| 1159 |
+
ra lại
|
| 1160 |
+
ra lời
|
| 1161 |
+
ra ngôi
|
| 1162 |
+
ra người
|
| 1163 |
+
ra sao
|
| 1164 |
+
ra tay
|
| 1165 |
+
ra vào
|
| 1166 |
+
ra ý
|
| 1167 |
+
ra điều
|
| 1168 |
+
ra đây
|
| 1169 |
+
ren rén
|
| 1170 |
+
riu ríu
|
| 1171 |
+
riêng
|
| 1172 |
+
riêng từng
|
| 1173 |
+
riệt
|
| 1174 |
+
rày
|
| 1175 |
+
ráo
|
| 1176 |
+
ráo cả
|
| 1177 |
+
ráo nước
|
| 1178 |
+
ráo trọi
|
| 1179 |
+
rén
|
| 1180 |
+
rén bước
|
| 1181 |
+
rích
|
| 1182 |
+
rón rén
|
| 1183 |
+
rõ
|
| 1184 |
+
rõ là
|
| 1185 |
+
rõ thật
|
| 1186 |
+
rút cục
|
| 1187 |
+
răng
|
| 1188 |
+
răng răng
|
| 1189 |
+
rất
|
| 1190 |
+
rất lâu
|
| 1191 |
+
rằng
|
| 1192 |
+
rằng là
|
| 1193 |
+
rốt cuộc
|
| 1194 |
+
rốt cục
|
| 1195 |
+
rồi
|
| 1196 |
+
rồi nữa
|
| 1197 |
+
rồi ra
|
| 1198 |
+
rồi sao
|
| 1199 |
+
rồi sau
|
| 1200 |
+
rồi tay
|
| 1201 |
+
rồi thì
|
| 1202 |
+
rồi xem
|
| 1203 |
+
rồi đây
|
| 1204 |
+
rứa
|
| 1205 |
+
sa sả
|
| 1206 |
+
sang
|
| 1207 |
+
sang năm
|
| 1208 |
+
sang sáng
|
| 1209 |
+
sang tay
|
| 1210 |
+
sao
|
| 1211 |
+
sao bản
|
| 1212 |
+
sao bằng
|
| 1213 |
+
sao cho
|
| 1214 |
+
sao vậy
|
| 1215 |
+
sao đang
|
| 1216 |
+
sau
|
| 1217 |
+
sau chót
|
| 1218 |
+
sau cuối
|
| 1219 |
+
sau cùng
|
| 1220 |
+
sau hết
|
| 1221 |
+
sau này
|
| 1222 |
+
sau nữa
|
| 1223 |
+
sau sau
|
| 1224 |
+
sau đây
|
| 1225 |
+
sau đó
|
| 1226 |
+
so
|
| 1227 |
+
so với
|
| 1228 |
+
song le
|
| 1229 |
+
suýt
|
| 1230 |
+
suýt nữa
|
| 1231 |
+
sáng
|
| 1232 |
+
sáng ngày
|
| 1233 |
+
sáng rõ
|
| 1234 |
+
sáng thế
|
| 1235 |
+
sáng ý
|
| 1236 |
+
sì
|
| 1237 |
+
sì sì
|
| 1238 |
+
sất
|
| 1239 |
+
sắp
|
| 1240 |
+
sắp đặt
|
| 1241 |
+
sẽ
|
| 1242 |
+
sẽ biết
|
| 1243 |
+
sẽ hay
|
| 1244 |
+
số
|
| 1245 |
+
số cho biết
|
| 1246 |
+
số cụ thể
|
| 1247 |
+
số loại
|
| 1248 |
+
số là
|
| 1249 |
+
số người
|
| 1250 |
+
số phần
|
| 1251 |
+
số thiếu
|
| 1252 |
+
sốt sột
|
| 1253 |
+
sớm
|
| 1254 |
+
sớm ngày
|
| 1255 |
+
sở dĩ
|
| 1256 |
+
sử dụng
|
| 1257 |
+
sự
|
| 1258 |
+
sự thế
|
| 1259 |
+
sự việc
|
| 1260 |
+
tanh
|
| 1261 |
+
tanh tanh
|
| 1262 |
+
tay
|
| 1263 |
+
tay quay
|
| 1264 |
+
tha hồ
|
| 1265 |
+
tha hồ chơi
|
| 1266 |
+
tha hồ ăn
|
| 1267 |
+
than ôi
|
| 1268 |
+
thanh
|
| 1269 |
+
thanh ba
|
| 1270 |
+
thanh chuyển
|
| 1271 |
+
thanh không
|
| 1272 |
+
thanh thanh
|
| 1273 |
+
thanh tính
|
| 1274 |
+
thanh điều kiện
|
| 1275 |
+
thanh điểm
|
| 1276 |
+
thay đổi
|
| 1277 |
+
thay đổi tình trạng
|
| 1278 |
+
theo
|
| 1279 |
+
theo bước
|
| 1280 |
+
theo như
|
| 1281 |
+
theo tin
|
| 1282 |
+
thi thoảng
|
| 1283 |
+
thiếu
|
| 1284 |
+
thiếu gì
|
| 1285 |
+
thiếu điểm
|
| 1286 |
+
thoạt
|
| 1287 |
+
thoạt nghe
|
| 1288 |
+
thoạt nhiên
|
| 1289 |
+
thoắt
|
| 1290 |
+
thuần
|
| 1291 |
+
thuần ái
|
| 1292 |
+
thuộc
|
| 1293 |
+
thuộc bài
|
| 1294 |
+
thuộc cách
|
| 1295 |
+
thuộc lại
|
| 1296 |
+
thuộc từ
|
| 1297 |
+
thà
|
| 1298 |
+
thà là
|
| 1299 |
+
thà rằng
|
| 1300 |
+
thành ra
|
| 1301 |
+
thành thử
|
| 1302 |
+
thái quá
|
| 1303 |
+
tháng
|
| 1304 |
+
tháng ngày
|
| 1305 |
+
tháng năm
|
| 1306 |
+
tháng tháng
|
| 1307 |
+
thêm
|
| 1308 |
+
thêm chuyện
|
| 1309 |
+
thêm giờ
|
| 1310 |
+
thêm vào
|
| 1311 |
+
thì
|
| 1312 |
+
thì giờ
|
| 1313 |
+
thì là
|
| 1314 |
+
thì phải
|
| 1315 |
+
thì ra
|
| 1316 |
+
thì thôi
|
| 1317 |
+
thình lình
|
| 1318 |
+
thích
|
| 1319 |
+
thích cứ
|
| 1320 |
+
thích thuộc
|
| 1321 |
+
thích tự
|
| 1322 |
+
thích ý
|
| 1323 |
+
thím
|
| 1324 |
+
thôi
|
| 1325 |
+
thôi việc
|
| 1326 |
+
thúng thắng
|
| 1327 |
+
thương ôi
|
| 1328 |
+
thường
|
| 1329 |
+
thường bị
|
| 1330 |
+
thường hay
|
| 1331 |
+
thường khi
|
| 1332 |
+
thường số
|
| 1333 |
+
thường sự
|
| 1334 |
+
thường thôi
|
| 1335 |
+
thường thường
|
| 1336 |
+
thường tính
|
| 1337 |
+
thường tại
|
| 1338 |
+
thường xuất hiện
|
| 1339 |
+
thường đến
|
| 1340 |
+
thảo hèn
|
| 1341 |
+
thảo nào
|
| 1342 |
+
thấp
|
| 1343 |
+
thấp cơ
|
| 1344 |
+
thấp thỏm
|
| 1345 |
+
thấp xuống
|
| 1346 |
+
thấy
|
| 1347 |
+
thấy tháng
|
| 1348 |
+
thẩy
|
| 1349 |
+
thậm
|
| 1350 |
+
thậm chí
|
| 1351 |
+
thậm cấp
|
| 1352 |
+
thậm từ
|
| 1353 |
+
thật
|
| 1354 |
+
thật chắc
|
| 1355 |
+
thật là
|
| 1356 |
+
thật lực
|
| 1357 |
+
thật quả
|
| 1358 |
+
thật ra
|
| 1359 |
+
thật sự
|
| 1360 |
+
thật thà
|
| 1361 |
+
thật tốt
|
| 1362 |
+
thật vậy
|
| 1363 |
+
thế
|
| 1364 |
+
thế chuẩn bị
|
| 1365 |
+
thế là
|
| 1366 |
+
thế lại
|
| 1367 |
+
thế mà
|
| 1368 |
+
thế nào
|
| 1369 |
+
thế nên
|
| 1370 |
+
thế ra
|
| 1371 |
+
thế sự
|
| 1372 |
+
thế thì
|
| 1373 |
+
thế thôi
|
| 1374 |
+
thế thường
|
| 1375 |
+
thế thế
|
| 1376 |
+
thế à
|
| 1377 |
+
thế đó
|
| 1378 |
+
thếch
|
| 1379 |
+
thỉnh thoảng
|
| 1380 |
+
thỏm
|
| 1381 |
+
thốc
|
| 1382 |
+
thốc tháo
|
| 1383 |
+
thốt
|
| 1384 |
+
thốt nhiên
|
| 1385 |
+
thốt nói
|
| 1386 |
+
thốt thôi
|
| 1387 |
+
thộc
|
| 1388 |
+
thời gian
|
| 1389 |
+
thời gian sử dụng
|
| 1390 |
+
thời gian tính
|
| 1391 |
+
thời điểm
|
| 1392 |
+
thục mạng
|
| 1393 |
+
thứ
|
| 1394 |
+
thứ bản
|
| 1395 |
+
thứ đến
|
| 1396 |
+
thửa
|
| 1397 |
+
thực hiện
|
| 1398 |
+
thực hiện đúng
|
| 1399 |
+
thực ra
|
| 1400 |
+
thực sự
|
| 1401 |
+
thực tế
|
| 1402 |
+
thực vậy
|
| 1403 |
+
tin
|
| 1404 |
+
tin thêm
|
| 1405 |
+
tin vào
|
| 1406 |
+
tiếp theo
|
| 1407 |
+
tiếp tục
|
| 1408 |
+
tiếp đó
|
| 1409 |
+
tiện thể
|
| 1410 |
+
toà
|
| 1411 |
+
toé khói
|
| 1412 |
+
toẹt
|
| 1413 |
+
trong
|
| 1414 |
+
trong khi
|
| 1415 |
+
trong lúc
|
| 1416 |
+
trong mình
|
| 1417 |
+
trong ngoài
|
| 1418 |
+
trong này
|
| 1419 |
+
trong số
|
| 1420 |
+
trong vùng
|
| 1421 |
+
trong đó
|
| 1422 |
+
trong ấy
|
| 1423 |
+
tránh
|
| 1424 |
+
tránh khỏi
|
| 1425 |
+
tránh ra
|
| 1426 |
+
tránh tình trạng
|
| 1427 |
+
tránh xa
|
| 1428 |
+
trên
|
| 1429 |
+
trên bộ
|
| 1430 |
+
trên dưới
|
| 1431 |
+
trước
|
| 1432 |
+
trước hết
|
| 1433 |
+
trước khi
|
| 1434 |
+
trước kia
|
| 1435 |
+
trước nay
|
| 1436 |
+
trước ngày
|
| 1437 |
+
trước nhất
|
| 1438 |
+
trước sau
|
| 1439 |
+
trước tiên
|
| 1440 |
+
trước tuổi
|
| 1441 |
+
trước đây
|
| 1442 |
+
trước đó
|
| 1443 |
+
trả
|
| 1444 |
+
trả của
|
| 1445 |
+
trả lại
|
| 1446 |
+
trả ngay
|
| 1447 |
+
trả trước
|
| 1448 |
+
trếu tráo
|
| 1449 |
+
trển
|
| 1450 |
+
trệt
|
| 1451 |
+
trệu trạo
|
| 1452 |
+
trỏng
|
| 1453 |
+
trời đất ơi
|
| 1454 |
+
trở thành
|
| 1455 |
+
trừ phi
|
| 1456 |
+
trực tiếp
|
| 1457 |
+
trực tiếp làm
|
| 1458 |
+
tuy
|
| 1459 |
+
tuy có
|
| 1460 |
+
tuy là
|
| 1461 |
+
tuy nhiên
|
| 1462 |
+
tuy rằng
|
| 1463 |
+
tuy thế
|
| 1464 |
+
tuy vậy
|
| 1465 |
+
tuy đã
|
| 1466 |
+
tuyệt nhiên
|
| 1467 |
+
tuần tự
|
| 1468 |
+
tuốt luốt
|
| 1469 |
+
tuốt tuồn tuột
|
| 1470 |
+
tuốt tuột
|
| 1471 |
+
tuổi
|
| 1472 |
+
tuổi cả
|
| 1473 |
+
tuổi tôi
|
| 1474 |
+
tà tà
|
| 1475 |
+
tên
|
| 1476 |
+
tên chính
|
| 1477 |
+
tên cái
|
| 1478 |
+
tên họ
|
| 1479 |
+
tên tự
|
| 1480 |
+
tênh
|
| 1481 |
+
tênh tênh
|
| 1482 |
+
tìm
|
| 1483 |
+
tìm bạn
|
| 1484 |
+
tìm cách
|
| 1485 |
+
tìm hiểu
|
| 1486 |
+
tìm ra
|
| 1487 |
+
tìm việc
|
| 1488 |
+
tình trạng
|
| 1489 |
+
tính
|
| 1490 |
+
tính cách
|
| 1491 |
+
tính căn
|
| 1492 |
+
tính người
|
| 1493 |
+
tính phỏng
|
| 1494 |
+
tính từ
|
| 1495 |
+
tít mù
|
| 1496 |
+
tò te
|
| 1497 |
+
tôi
|
| 1498 |
+
tôi con
|
| 1499 |
+
tông tốc
|
| 1500 |
+
tù tì
|
| 1501 |
+
tăm tắp
|
| 1502 |
+
tăng
|
| 1503 |
+
tăng chúng
|
| 1504 |
+
tăng cấp
|
| 1505 |
+
tăng giảm
|
| 1506 |
+
tăng thêm
|
| 1507 |
+
tăng thế
|
| 1508 |
+
tại
|
| 1509 |
+
tại lòng
|
| 1510 |
+
tại nơi
|
| 1511 |
+
tại sao
|
| 1512 |
+
tại tôi
|
| 1513 |
+
tại vì
|
| 1514 |
+
tại đâu
|
| 1515 |
+
tại đây
|
| 1516 |
+
tại đó
|
| 1517 |
+
tạo
|
| 1518 |
+
tạo cơ hội
|
| 1519 |
+
tạo nên
|
| 1520 |
+
tạo ra
|
| 1521 |
+
tạo ý
|
| 1522 |
+
tạo điều kiện
|
| 1523 |
+
tấm
|
| 1524 |
+
tấm bản
|
| 1525 |
+
tấm các
|
| 1526 |
+
tấn
|
| 1527 |
+
tấn tới
|
| 1528 |
+
tất cả
|
| 1529 |
+
tất cả bao nhiêu
|
| 1530 |
+
tất thảy
|
| 1531 |
+
tất tần tật
|
| 1532 |
+
tất tật
|
| 1533 |
+
tập trung
|
| 1534 |
+
tắp
|
| 1535 |
+
tắp lự
|
| 1536 |
+
tắp tắp
|
| 1537 |
+
tọt
|
| 1538 |
+
tỏ ra
|
| 1539 |
+
tỏ vẻ
|
| 1540 |
+
tốc tả
|
| 1541 |
+
tối ư
|
| 1542 |
+
tốt
|
| 1543 |
+
tốt bạn
|
| 1544 |
+
tốt bộ
|
| 1545 |
+
tốt hơn
|
| 1546 |
+
tốt mối
|
| 1547 |
+
tốt ngày
|
| 1548 |
+
tột
|
| 1549 |
+
tột cùng
|
| 1550 |
+
tớ
|
| 1551 |
+
tới
|
| 1552 |
+
tới gần
|
| 1553 |
+
tới mức
|
| 1554 |
+
tới nơi
|
| 1555 |
+
tới thì
|
| 1556 |
+
tức thì
|
| 1557 |
+
tức tốc
|
| 1558 |
+
từ
|
| 1559 |
+
từ căn
|
| 1560 |
+
từ giờ
|
| 1561 |
+
từ khi
|
| 1562 |
+
từ loại
|
| 1563 |
+
từ nay
|
| 1564 |
+
từ thế
|
| 1565 |
+
từ tính
|
| 1566 |
+
từ tại
|
| 1567 |
+
từ từ
|
| 1568 |
+
từ ái
|
| 1569 |
+
từ điều
|
| 1570 |
+
từ đó
|
| 1571 |
+
từ ấy
|
| 1572 |
+
từng
|
| 1573 |
+
từng cái
|
| 1574 |
+
từng giờ
|
| 1575 |
+
từng nhà
|
| 1576 |
+
từng phần
|
| 1577 |
+
từng thời gian
|
| 1578 |
+
từng đơn vị
|
| 1579 |
+
từng ấy
|
| 1580 |
+
tự
|
| 1581 |
+
tự cao
|
| 1582 |
+
tự khi
|
| 1583 |
+
tự lượng
|
| 1584 |
+
tự tính
|
| 1585 |
+
tự tạo
|
| 1586 |
+
tự vì
|
| 1587 |
+
tự ý
|
| 1588 |
+
tự ăn
|
| 1589 |
+
tựu trung
|
| 1590 |
+
veo
|
| 1591 |
+
veo veo
|
| 1592 |
+
việc
|
| 1593 |
+
việc gì
|
| 1594 |
+
vung thiên địa
|
| 1595 |
+
vung tàn tán
|
| 1596 |
+
vung tán tàn
|
| 1597 |
+
và
|
| 1598 |
+
vài
|
| 1599 |
+
vài ba
|
| 1600 |
+
vài người
|
| 1601 |
+
vài nhà
|
| 1602 |
+
vài nơi
|
| 1603 |
+
vài tên
|
| 1604 |
+
vài điều
|
| 1605 |
+
vào
|
| 1606 |
+
vào gặp
|
| 1607 |
+
vào khoảng
|
| 1608 |
+
vào lúc
|
| 1609 |
+
vào vùng
|
| 1610 |
+
vào đến
|
| 1611 |
+
vâng
|
| 1612 |
+
vâng chịu
|
| 1613 |
+
vâng dạ
|
| 1614 |
+
vâng vâng
|
| 1615 |
+
vâng ý
|
| 1616 |
+
vèo
|
| 1617 |
+
vèo vèo
|
| 1618 |
+
vì
|
| 1619 |
+
vì chưng
|
| 1620 |
+
vì rằng
|
| 1621 |
+
vì sao
|
| 1622 |
+
vì thế
|
| 1623 |
+
vì vậy
|
| 1624 |
+
ví bằng
|
| 1625 |
+
ví dù
|
| 1626 |
+
ví phỏng
|
| 1627 |
+
ví thử
|
| 1628 |
+
vô hình trung
|
| 1629 |
+
vô kể
|
| 1630 |
+
vô luận
|
| 1631 |
+
vô vàn
|
| 1632 |
+
vùng
|
| 1633 |
+
vùng lên
|
| 1634 |
+
vùng nước
|
| 1635 |
+
văng tê
|
| 1636 |
+
vượt
|
| 1637 |
+
vượt khỏi
|
| 1638 |
+
vượt quá
|
| 1639 |
+
vạn nhất
|
| 1640 |
+
vả chăng
|
| 1641 |
+
vả lại
|
| 1642 |
+
vấn đề
|
| 1643 |
+
vấn đề quan trọng
|
| 1644 |
+
vẫn
|
| 1645 |
+
vẫn thế
|
| 1646 |
+
vậy
|
| 1647 |
+
vậy là
|
| 1648 |
+
vậy mà
|
| 1649 |
+
vậy nên
|
| 1650 |
+
vậy ra
|
| 1651 |
+
vậy thì
|
| 1652 |
+
vậy ư
|
| 1653 |
+
về
|
| 1654 |
+
về không
|
| 1655 |
+
về nước
|
| 1656 |
+
về phần
|
| 1657 |
+
về sau
|
| 1658 |
+
về tay
|
| 1659 |
+
vị trí
|
| 1660 |
+
vị tất
|
| 1661 |
+
vốn dĩ
|
| 1662 |
+
với
|
| 1663 |
+
với lại
|
| 1664 |
+
với nhau
|
| 1665 |
+
vở
|
| 1666 |
+
vụt
|
| 1667 |
+
vừa
|
| 1668 |
+
vừa khi
|
| 1669 |
+
vừa lúc
|
| 1670 |
+
vừa mới
|
| 1671 |
+
vừa qua
|
| 1672 |
+
vừa rồi
|
| 1673 |
+
vừa vừa
|
| 1674 |
+
xa
|
| 1675 |
+
xa cách
|
| 1676 |
+
xa gần
|
| 1677 |
+
xa nhà
|
| 1678 |
+
xa tanh
|
| 1679 |
+
xa tắp
|
| 1680 |
+
xa xa
|
| 1681 |
+
xa xả
|
| 1682 |
+
xem
|
| 1683 |
+
xem lại
|
| 1684 |
+
xem ra
|
| 1685 |
+
xem số
|
| 1686 |
+
xin
|
| 1687 |
+
xin gặp
|
| 1688 |
+
xin vâng
|
| 1689 |
+
xiết bao
|
| 1690 |
+
xon xón
|
| 1691 |
+
xoành xoạch
|
| 1692 |
+
xoét
|
| 1693 |
+
xoẳn
|
| 1694 |
+
xoẹt
|
| 1695 |
+
xuất hiện
|
| 1696 |
+
xuất kì bất ý
|
| 1697 |
+
xuất kỳ bất ý
|
| 1698 |
+
xuể
|
| 1699 |
+
xuống
|
| 1700 |
+
xăm xúi
|
| 1701 |
+
xăm xăm
|
| 1702 |
+
xăm xắm
|
| 1703 |
+
xảy ra
|
| 1704 |
+
xềnh xệch
|
| 1705 |
+
xệp
|
| 1706 |
+
xử lý
|
| 1707 |
+
yêu cầu
|
| 1708 |
+
à
|
| 1709 |
+
à này
|
| 1710 |
+
à ơi
|
| 1711 |
+
ào
|
| 1712 |
+
ào vào
|
| 1713 |
+
ào ào
|
| 1714 |
+
á
|
| 1715 |
+
á à
|
| 1716 |
+
ái
|
| 1717 |
+
ái chà
|
| 1718 |
+
ái dà
|
| 1719 |
+
áng
|
| 1720 |
+
áng như
|
| 1721 |
+
âu là
|
| 1722 |
+
ít
|
| 1723 |
+
ít biết
|
| 1724 |
+
ít có
|
| 1725 |
+
ít hơn
|
| 1726 |
+
ít khi
|
| 1727 |
+
ít lâu
|
| 1728 |
+
ít nhiều
|
| 1729 |
+
ít nhất
|
| 1730 |
+
ít nữa
|
| 1731 |
+
ít quá
|
| 1732 |
+
ít ra
|
| 1733 |
+
ít thôi
|
| 1734 |
+
ít thấy
|
| 1735 |
+
ô hay
|
| 1736 |
+
ô hô
|
| 1737 |
+
ô kê
|
| 1738 |
+
ô kìa
|
| 1739 |
+
ôi chao
|
| 1740 |
+
ôi thôi
|
| 1741 |
+
ông
|
| 1742 |
+
ông nhỏ
|
| 1743 |
+
ông tạo
|
| 1744 |
+
ông từ
|
| 1745 |
+
ông ấy
|
| 1746 |
+
ông ổng
|
| 1747 |
+
úi
|
| 1748 |
+
úi chà
|
| 1749 |
+
úi dào
|
| 1750 |
+
ý
|
| 1751 |
+
ý chừng
|
| 1752 |
+
ý da
|
| 1753 |
+
ý hoặc
|
| 1754 |
+
ăn
|
| 1755 |
+
ăn chung
|
| 1756 |
+
ăn chắc
|
| 1757 |
+
ăn chịu
|
| 1758 |
+
ăn cuộc
|
| 1759 |
+
ăn hết
|
| 1760 |
+
ăn hỏi
|
| 1761 |
+
ăn làm
|
| 1762 |
+
ăn người
|
| 1763 |
+
ăn ngồi
|
| 1764 |
+
ăn quá
|
| 1765 |
+
ăn riêng
|
| 1766 |
+
ăn sáng
|
| 1767 |
+
ăn tay
|
| 1768 |
+
ăn trên
|
| 1769 |
+
ăn về
|
| 1770 |
+
đang
|
| 1771 |
+
đang tay
|
| 1772 |
+
đang thì
|
| 1773 |
+
điều
|
| 1774 |
+
điều gì
|
| 1775 |
+
điều kiện
|
| 1776 |
+
điểm
|
| 1777 |
+
điểm chính
|
| 1778 |
+
điểm gặp
|
| 1779 |
+
điểm đầu tiên
|
| 1780 |
+
đành đạch
|
| 1781 |
+
đáng
|
| 1782 |
+
đáng kể
|
| 1783 |
+
đáng lí
|
| 1784 |
+
đáng lý
|
| 1785 |
+
đáng lẽ
|
| 1786 |
+
đáng số
|
| 1787 |
+
đánh giá
|
| 1788 |
+
đánh đùng
|
| 1789 |
+
đáo để
|
| 1790 |
+
đâu
|
| 1791 |
+
đâu có
|
| 1792 |
+
đâu cũng
|
| 1793 |
+
đâu như
|
| 1794 |
+
đâu nào
|
| 1795 |
+
đâu phải
|
| 1796 |
+
đâu đâu
|
| 1797 |
+
đâu đây
|
| 1798 |
+
đâu đó
|
| 1799 |
+
đây
|
| 1800 |
+
đây này
|
| 1801 |
+
đây rồi
|
| 1802 |
+
đây đó
|
| 1803 |
+
đã
|
| 1804 |
+
đã hay
|
| 1805 |
+
đã không
|
| 1806 |
+
đã là
|
| 1807 |
+
đã lâu
|
| 1808 |
+
đã thế
|
| 1809 |
+
đã vậy
|
| 1810 |
+
đã đủ
|
| 1811 |
+
đó
|
| 1812 |
+
đó đây
|
| 1813 |
+
đúng
|
| 1814 |
+
đúng ngày
|
| 1815 |
+
đúng ra
|
| 1816 |
+
đúng tuổi
|
| 1817 |
+
đúng với
|
| 1818 |
+
đơn vị
|
| 1819 |
+
đưa
|
| 1820 |
+
đưa cho
|
| 1821 |
+
đưa chuyện
|
| 1822 |
+
đưa em
|
| 1823 |
+
đưa ra
|
| 1824 |
+
đưa tay
|
| 1825 |
+
đưa tin
|
| 1826 |
+
đưa tới
|
| 1827 |
+
đưa vào
|
| 1828 |
+
đưa về
|
| 1829 |
+
đưa xuống
|
| 1830 |
+
đưa đến
|
| 1831 |
+
được
|
| 1832 |
+
được cái
|
| 1833 |
+
được lời
|
| 1834 |
+
được nước
|
| 1835 |
+
được tin
|
| 1836 |
+
đại loại
|
| 1837 |
+
đại nhân
|
| 1838 |
+
đại phàm
|
| 1839 |
+
đại để
|
| 1840 |
+
đạt
|
| 1841 |
+
đảm bảo
|
| 1842 |
+
đầu tiên
|
| 1843 |
+
đầy
|
| 1844 |
+
đầy năm
|
| 1845 |
+
đầy phè
|
| 1846 |
+
đầy tuổi
|
| 1847 |
+
đặc biệt
|
| 1848 |
+
đặt
|
| 1849 |
+
đặt làm
|
| 1850 |
+
đặt mình
|
| 1851 |
+
đặt mức
|
| 1852 |
+
đặt ra
|
| 1853 |
+
đặt trước
|
| 1854 |
+
đặt để
|
| 1855 |
+
đến
|
| 1856 |
+
đến bao giờ
|
| 1857 |
+
đến cùng
|
| 1858 |
+
đến cùng cực
|
| 1859 |
+
đến cả
|
| 1860 |
+
đến giờ
|
| 1861 |
+
đến gần
|
| 1862 |
+
đến hay
|
| 1863 |
+
đến khi
|
| 1864 |
+
đến lúc
|
| 1865 |
+
đến lời
|
| 1866 |
+
đến nay
|
| 1867 |
+
đến ngày
|
| 1868 |
+
đến nơi
|
| 1869 |
+
đến nỗi
|
| 1870 |
+
đến thì
|
| 1871 |
+
đến thế
|
| 1872 |
+
đến tuổi
|
| 1873 |
+
đến xem
|
| 1874 |
+
đến điều
|
| 1875 |
+
đến đâu
|
| 1876 |
+
đều
|
| 1877 |
+
đều bước
|
| 1878 |
+
đều nhau
|
| 1879 |
+
đều đều
|
| 1880 |
+
để
|
| 1881 |
+
để cho
|
| 1882 |
+
để giống
|
| 1883 |
+
để không
|
| 1884 |
+
để lòng
|
| 1885 |
+
để lại
|
| 1886 |
+
để mà
|
| 1887 |
+
để phần
|
| 1888 |
+
để được
|
| 1889 |
+
để đến nỗi
|
| 1890 |
+
đối với
|
| 1891 |
+
đồng thời
|
| 1892 |
+
đủ
|
| 1893 |
+
đủ dùng
|
| 1894 |
+
đủ nơi
|
| 1895 |
+
đủ số
|
| 1896 |
+
đủ điều
|
| 1897 |
+
đủ điểm
|
| 1898 |
+
ơ
|
| 1899 |
+
ơ hay
|
| 1900 |
+
ơ kìa
|
| 1901 |
+
ơi
|
| 1902 |
+
ơi là
|
| 1903 |
+
ư
|
| 1904 |
+
ạ
|
| 1905 |
+
ạ ơi
|
| 1906 |
+
ấy
|
| 1907 |
+
ấy là
|
| 1908 |
+
ầu ơ
|
| 1909 |
+
ắt
|
| 1910 |
+
ắt hẳn
|
| 1911 |
+
ắt là
|
| 1912 |
+
ắt phải
|
| 1913 |
+
ắt thật
|
| 1914 |
+
ối dào
|
| 1915 |
+
ối giời
|
| 1916 |
+
ối giời ơi
|
| 1917 |
+
ồ
|
| 1918 |
+
ồ ồ
|
| 1919 |
+
ổng
|
| 1920 |
+
ớ
|
| 1921 |
+
ớ này
|
| 1922 |
+
ờ
|
| 1923 |
+
ờ ờ
|
| 1924 |
+
ở
|
| 1925 |
+
ở lại
|
| 1926 |
+
ở như
|
| 1927 |
+
ở nhờ
|
| 1928 |
+
ở năm
|
| 1929 |
+
ở trên
|
| 1930 |
+
ở vào
|
| 1931 |
+
ở đây
|
| 1932 |
+
ở đó
|
| 1933 |
+
ở được
|
| 1934 |
+
ủa
|
| 1935 |
+
ứ hự
|
| 1936 |
+
ứ ừ
|
| 1937 |
+
ừ
|
| 1938 |
+
ừ nhé
|
| 1939 |
+
ừ thì
|
| 1940 |
+
ừ ào
|
| 1941 |
+
ừ ừ
|
| 1942 |
+
ử
|
py/__init__.py
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Package initializer for the `py` package used by the Gradio app.
|
| 2 |
+
# Keep this file minimal to avoid importing heavy dependencies at package import time.
|
| 3 |
+
# You can add package-level metadata or lightweight helpers here.
|
| 4 |
+
|
| 5 |
+
"""
|
| 6 |
+
py — lightweight package wrapper for summarizers
|
| 7 |
+
|
| 8 |
+
This package exists so imports like `import py.extractive` or
|
| 9 |
+
`from py import extractive` work reliably when the summarizer modules
|
| 10 |
+
are placed in the `py/` directory.
|
| 11 |
+
"""
|
| 12 |
+
|
| 13 |
+
__all__ = []
|
| 14 |
+
|
| 15 |
+
# Optional package metadata
|
| 16 |
+
__version__ = "0.1.0"
|
| 17 |
+
|
| 18 |
+
def info():
|
| 19 |
+
return {
|
| 20 |
+
"package": "py",
|
| 21 |
+
"version": __version__,
|
| 22 |
+
"note": "This package holds extractive.py and abstractive.py summarizer modules."
|
| 23 |
+
}
|
py/abstractive.py
ADDED
|
@@ -0,0 +1,245 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# --- START OF FILE abstractive.py ---
|
| 2 |
+
|
| 3 |
+
import os
|
| 4 |
+
import re
|
| 5 |
+
import pickle
|
| 6 |
+
import unicodedata
|
| 7 |
+
import numpy as np
|
| 8 |
+
import torch
|
| 9 |
+
from transformers import AutoTokenizer, AutoModel
|
| 10 |
+
|
| 11 |
+
# -------------------------------------------------------------------
|
| 12 |
+
# CONFIG
|
| 13 |
+
# -------------------------------------------------------------------
|
| 14 |
+
CONFIG = {
|
| 15 |
+
"NUM_LAYERS": 2,
|
| 16 |
+
"MAX_VOCAB_OUT": 20000,
|
| 17 |
+
"MAX_TEXT_LEN": 256,
|
| 18 |
+
"MAX_SUMMARY_LEN": 50,
|
| 19 |
+
"EMBED_DIM": 512,
|
| 20 |
+
"NUM_HEADS": 4,
|
| 21 |
+
"FF_DIM": 2048,
|
| 22 |
+
"DROPOUT": 0.2,
|
| 23 |
+
"TOKENIZER_FILE": "decoder_tokenizer_re.pkl",
|
| 24 |
+
# LƯU Ý: Đây là file weights mới được tạo từ Bước 1
|
| 25 |
+
"WEIGHTS_FILE": "decoder_only.weights.h5"
|
| 26 |
+
}
|
| 27 |
+
|
| 28 |
+
# -------------------------------------------------------------------
|
| 29 |
+
# CLEAN TEXT (Cố gắng khớp logic với Colab nhất có thể)
|
| 30 |
+
# -------------------------------------------------------------------
|
| 31 |
+
def clean_text_inference(text: str) -> str:
|
| 32 |
+
if not text:
|
| 33 |
+
return ""
|
| 34 |
+
text = unicodedata.normalize("NFC", str(text))
|
| 35 |
+
text = re.sub(r"<.*?>", " ", text)
|
| 36 |
+
# Giữ lại các ký tự cơ bản giống Colab
|
| 37 |
+
text = "".join(ch if (ch.isalpha() or ch.isspace() or ch.isdigit() or ch in ['/', '-']) else " " for ch in text)
|
| 38 |
+
text = text.lower()
|
| 39 |
+
text = re.sub(r"\s+", " ", text).strip()
|
| 40 |
+
return text
|
| 41 |
+
|
| 42 |
+
# -------------------------------------------------------------------
|
| 43 |
+
# PHOBERT ENCODER (PyTorch)
|
| 44 |
+
# -------------------------------------------------------------------
|
| 45 |
+
class PhoBERTEncoderTorch:
|
| 46 |
+
def __init__(self):
|
| 47 |
+
print(">>> Loading PhoBERT (PyTorch)...")
|
| 48 |
+
self.device = torch.device("cpu")
|
| 49 |
+
self.model = AutoModel.from_pretrained("vinai/phobert-base").to(self.device)
|
| 50 |
+
self.model.eval()
|
| 51 |
+
print(">>> PhoBERT loaded successfully.")
|
| 52 |
+
|
| 53 |
+
def encode(self, input_ids, attention_mask):
|
| 54 |
+
with torch.no_grad():
|
| 55 |
+
ids = torch.tensor(input_ids).to(self.device)
|
| 56 |
+
mask = torch.tensor(attention_mask).to(self.device)
|
| 57 |
+
outputs = self.model(ids, attention_mask=mask)
|
| 58 |
+
# Output shape: (Batch, Seq_Len, 768)
|
| 59 |
+
return outputs.last_hidden_state.cpu().numpy()
|
| 60 |
+
|
| 61 |
+
# -------------------------------------------------------------------
|
| 62 |
+
# SAFE IMPORT TENSORFLOW
|
| 63 |
+
# -------------------------------------------------------------------
|
| 64 |
+
TF_AVAILABLE = True
|
| 65 |
+
try:
|
| 66 |
+
import tensorflow as tf
|
| 67 |
+
except Exception as e:
|
| 68 |
+
TF_AVAILABLE = False
|
| 69 |
+
_TF_ERR = e
|
| 70 |
+
tf = None
|
| 71 |
+
|
| 72 |
+
# -------------------------------------------------------------------
|
| 73 |
+
# DECODER TRANSFORMER (TensorFlow)
|
| 74 |
+
# -------------------------------------------------------------------
|
| 75 |
+
if TF_AVAILABLE:
|
| 76 |
+
class TransformerDecoderBlock(tf.keras.layers.Layer):
|
| 77 |
+
def __init__(self, embed_dim, num_heads, ff_dim, rate=0.1, **kwargs):
|
| 78 |
+
super().__init__(**kwargs)
|
| 79 |
+
self.att1 = tf.keras.layers.MultiHeadAttention(num_heads=num_heads, key_dim=embed_dim)
|
| 80 |
+
self.att2 = tf.keras.layers.MultiHeadAttention(num_heads=num_heads, key_dim=embed_dim)
|
| 81 |
+
self.ffn = tf.keras.Sequential([
|
| 82 |
+
tf.keras.layers.Dense(ff_dim, activation="relu"),
|
| 83 |
+
tf.keras.layers.Dense(embed_dim),
|
| 84 |
+
])
|
| 85 |
+
self.ln1 = tf.keras.layers.LayerNormalization(epsilon=1e-6)
|
| 86 |
+
self.ln2 = tf.keras.layers.LayerNormalization(epsilon=1e-6)
|
| 87 |
+
self.ln3 = tf.keras.layers.LayerNormalization(epsilon=1e-6)
|
| 88 |
+
self.drop1 = tf.keras.layers.Dropout(rate)
|
| 89 |
+
self.drop2 = tf.keras.layers.Dropout(rate)
|
| 90 |
+
self.drop3 = tf.keras.layers.Dropout(rate)
|
| 91 |
+
|
| 92 |
+
def call(self, x, enc_output, training=None):
|
| 93 |
+
attn1 = self.att1(x, x, use_causal_mask=True)
|
| 94 |
+
out1 = self.ln1(x + self.drop1(attn1, training=training))
|
| 95 |
+
attn2 = self.att2(out1, enc_output)
|
| 96 |
+
out2 = self.ln2(out1 + self.drop2(attn2, training=training))
|
| 97 |
+
ffn_out = self.ffn(out2)
|
| 98 |
+
return self.ln3(out2 + self.drop3(ffn_out, training=training))
|
| 99 |
+
|
| 100 |
+
# -------------------------------------------------------------------
|
| 101 |
+
# BUILD DECODER MODEL (Đã chỉnh sửa để khớp với file export)
|
| 102 |
+
# -------------------------------------------------------------------
|
| 103 |
+
def build_inference_model():
|
| 104 |
+
# 1. Inputs
|
| 105 |
+
# enc_raw_input: nhận output 768 chiều từ PhoBERT PyTorch
|
| 106 |
+
enc_raw_input = tf.keras.Input(shape=(None, 768), name='enc_raw_input')
|
| 107 |
+
dec_inputs_inf = tf.keras.Input(shape=(None,), dtype=tf.int32, name='dec_inputs_inf')
|
| 108 |
+
|
| 109 |
+
# 2. Projection Layer (Quan trọng: Phải đặt tên đúng để load weights)
|
| 110 |
+
# Layer này chuyển 768 -> 512
|
| 111 |
+
enc_out = tf.keras.layers.Dense(CONFIG["EMBED_DIM"], activation="linear", name="encoder_projection")(enc_raw_input)
|
| 112 |
+
enc_out = tf.keras.layers.Dropout(CONFIG["DROPOUT"], name="encoder_dropout")(enc_out)
|
| 113 |
+
|
| 114 |
+
# 3. Embeddings
|
| 115 |
+
dec_token_emb = tf.keras.layers.Embedding(CONFIG["MAX_VOCAB_OUT"], CONFIG["EMBED_DIM"], mask_zero=True, name='dec_token_emb')
|
| 116 |
+
dec_pos_emb = tf.keras.layers.Embedding(CONFIG["MAX_SUMMARY_LEN"], CONFIG["EMBED_DIM"], name='dec_pos_emb')
|
| 117 |
+
|
| 118 |
+
def add_pos_emb_inf(x):
|
| 119 |
+
tokens = dec_token_emb(x)
|
| 120 |
+
seq_len = tf.shape(x)[1]
|
| 121 |
+
pos_idx = tf.range(seq_len)
|
| 122 |
+
pos_emb = dec_pos_emb(pos_idx)
|
| 123 |
+
pos_emb = tf.expand_dims(pos_emb, 0)
|
| 124 |
+
return tokens + pos_emb
|
| 125 |
+
|
| 126 |
+
# Wrap lambda để khớp cấu trúc
|
| 127 |
+
dec_emb_inf = tf.keras.layers.Lambda(add_pos_emb_inf, name='dec_emb_plus_pos_inf')(dec_inputs_inf)
|
| 128 |
+
|
| 129 |
+
# 4. Decoder Blocks
|
| 130 |
+
dec_out = dec_emb_inf
|
| 131 |
+
for i in range(CONFIG["NUM_LAYERS"]):
|
| 132 |
+
# Tên block phải khớp: decoder_block_0, decoder_block_1...
|
| 133 |
+
block = TransformerDecoderBlock(
|
| 134 |
+
CONFIG["EMBED_DIM"],
|
| 135 |
+
CONFIG["NUM_HEADS"],
|
| 136 |
+
CONFIG["FF_DIM"],
|
| 137 |
+
CONFIG["DROPOUT"],
|
| 138 |
+
name=f"decoder_block_{i}"
|
| 139 |
+
)
|
| 140 |
+
dec_out = block(dec_out, enc_out, training=False)
|
| 141 |
+
|
| 142 |
+
# 5. Output
|
| 143 |
+
outputs_inf = tf.keras.layers.Dense(CONFIG["MAX_VOCAB_OUT"], activation='softmax', name='output_dense')(dec_out)
|
| 144 |
+
|
| 145 |
+
model = tf.keras.Model(inputs=[enc_raw_input, dec_inputs_inf], outputs=outputs_inf, name="inference_decoder_export")
|
| 146 |
+
return model
|
| 147 |
+
|
| 148 |
+
# -------------------------------------------------------------------
|
| 149 |
+
# MAIN SUMMARIZER
|
| 150 |
+
# -------------------------------------------------------------------
|
| 151 |
+
class AbstractiveSummarizer:
|
| 152 |
+
def __init__(self, model_dir="./models"):
|
| 153 |
+
if not TF_AVAILABLE:
|
| 154 |
+
raise RuntimeError(f"TensorFlow không khả dụng: {_TF_ERR}")
|
| 155 |
+
|
| 156 |
+
self.model_dir = model_dir
|
| 157 |
+
|
| 158 |
+
# Load PhoBERT (PyTorch)
|
| 159 |
+
self.phobert = PhoBERTEncoderTorch()
|
| 160 |
+
self.phobert_tokenizer = AutoTokenizer.from_pretrained("vinai/phobert-base")
|
| 161 |
+
|
| 162 |
+
self._load_resources()
|
| 163 |
+
|
| 164 |
+
def _load_resources(self):
|
| 165 |
+
tok_path = os.path.join(self.model_dir, CONFIG["TOKENIZER_FILE"])
|
| 166 |
+
weights_path = os.path.join(self.model_dir, CONFIG["WEIGHTS_FILE"])
|
| 167 |
+
|
| 168 |
+
print(f"📥 Loading tokenizer from {tok_path}...")
|
| 169 |
+
with open(tok_path, "rb") as f:
|
| 170 |
+
self.tokenizer = pickle.load(f)
|
| 171 |
+
|
| 172 |
+
print("⚙️ Building Inference Model...")
|
| 173 |
+
self.decoder_model = build_inference_model()
|
| 174 |
+
|
| 175 |
+
print(f"📥 Loading weights from {weights_path}...")
|
| 176 |
+
try:
|
| 177 |
+
# Load weights. Quan trọng: skip_mismatch=False để đảm bảo mọi thứ khớp 100%
|
| 178 |
+
self.decoder_model.load_weights(weights_path)
|
| 179 |
+
print("✅ Weights loaded successfully!")
|
| 180 |
+
except Exception as e:
|
| 181 |
+
print(f"❌ Error loading weights: {e}")
|
| 182 |
+
print("Vui lòng đảm bảo bạn đã chạy bước Export trên Colab và tải file 'decoder_only.weights.h5' về.")
|
| 183 |
+
|
| 184 |
+
def beam_search(self, enc_out, k=3):
|
| 185 |
+
start_token = self.tokenizer.word_index.get('startseq', 1)
|
| 186 |
+
end_token = self.tokenizer.word_index.get('endseq', 2)
|
| 187 |
+
|
| 188 |
+
# Sequence bắt đầu: (score, [start_token])
|
| 189 |
+
sequences = [(0.0, [start_token])]
|
| 190 |
+
|
| 191 |
+
for _ in range(CONFIG["MAX_SUMMARY_LEN"] - 1):
|
| 192 |
+
all_candidates = []
|
| 193 |
+
for score, seq in sequences:
|
| 194 |
+
if seq[-1] == end_token:
|
| 195 |
+
all_candidates.append((score, seq))
|
| 196 |
+
continue
|
| 197 |
+
|
| 198 |
+
dec_inp = np.array([seq]) # (1, cur_len)
|
| 199 |
+
|
| 200 |
+
# Predict: [enc_out (1, seq, 768), dec_inp (1, cur_len)]
|
| 201 |
+
preds = self.decoder_model.predict([enc_out, dec_inp], verbose=0)
|
| 202 |
+
|
| 203 |
+
# Lấy token cuối cùng
|
| 204 |
+
last_token_probs = preds[0, -1, :]
|
| 205 |
+
|
| 206 |
+
# Top k
|
| 207 |
+
top_idx = np.argsort(last_token_probs)[-k:][::-1]
|
| 208 |
+
for idx in top_idx:
|
| 209 |
+
candidate_seq = seq + [int(idx)]
|
| 210 |
+
# Log probability để cộng dồn điểm (tránh số quá nhỏ)
|
| 211 |
+
candidate_score = score + float(np.log(last_token_probs[idx] + 1e-12))
|
| 212 |
+
all_candidates.append((candidate_score, candidate_seq))
|
| 213 |
+
|
| 214 |
+
# Chọn k chuỗi tốt nhất
|
| 215 |
+
sequences = sorted(all_candidates, key=lambda x: x[0], reverse=True)[:k]
|
| 216 |
+
|
| 217 |
+
# Nếu tất cả chuỗi đều đã kết thúc thì dừng sớm
|
| 218 |
+
if all(s[-1] == end_token for _, s in sequences):
|
| 219 |
+
break
|
| 220 |
+
|
| 221 |
+
return sequences[0][1]
|
| 222 |
+
|
| 223 |
+
def summarize(self, text, k=3):
|
| 224 |
+
# 1. Clean Text
|
| 225 |
+
text_clean = clean_text_inference(text)
|
| 226 |
+
|
| 227 |
+
# 2. Tokenize Input (PhoBERT)
|
| 228 |
+
inp = self.phobert_tokenizer(
|
| 229 |
+
[text_clean],
|
| 230 |
+
max_length=CONFIG["MAX_TEXT_LEN"],
|
| 231 |
+
truncation=True, padding='max_length',
|
| 232 |
+
return_tensors='np'
|
| 233 |
+
)
|
| 234 |
+
|
| 235 |
+
# 3. Encode bằng PyTorch (nhận về vector 768 chiều)
|
| 236 |
+
enc_out = self.phobert.encode(inp['input_ids'], inp['attention_mask'])
|
| 237 |
+
|
| 238 |
+
# 4. Generate Summary bằng TF Model (có tích hợp Projection 768->512)
|
| 239 |
+
seq = self.beam_search(enc_out, k=k)
|
| 240 |
+
|
| 241 |
+
# 5. Decode kết quả
|
| 242 |
+
decoded_text = self.tokenizer.sequences_to_texts([seq])[0]
|
| 243 |
+
summary = decoded_text.replace('startseq', '').replace('endseq', '').strip()
|
| 244 |
+
|
| 245 |
+
return summary
|
py/extractive.py
ADDED
|
@@ -0,0 +1,112 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# py/extractive.py
|
| 2 |
+
# Extractive summarizer module adapted for deployment (TextRank + TF-IDF)
|
| 3 |
+
import re
|
| 4 |
+
import os
|
| 5 |
+
import random
|
| 6 |
+
import networkx as nx
|
| 7 |
+
import numpy as np
|
| 8 |
+
from sklearn.feature_extraction.text import TfidfVectorizer
|
| 9 |
+
from sklearn.metrics.pairwise import cosine_similarity
|
| 10 |
+
|
| 11 |
+
try:
|
| 12 |
+
import py_vncorenlp
|
| 13 |
+
_VNCORENLP_AVAILABLE = True
|
| 14 |
+
except Exception:
|
| 15 |
+
_VNCORENLP_AVAILABLE = False
|
| 16 |
+
|
| 17 |
+
# Optional path for stopwords; if absent we'll use None
|
| 18 |
+
DEFAULT_STOPWORDS_PATH = os.path.join("data", "Vietnamese-stopwords.txt")
|
| 19 |
+
|
| 20 |
+
|
| 21 |
+
def load_stopwords(path=None):
|
| 22 |
+
p = path or DEFAULT_STOPWORDS_PATH
|
| 23 |
+
if os.path.exists(p):
|
| 24 |
+
try:
|
| 25 |
+
with open(p, "r", encoding="utf-8") as f:
|
| 26 |
+
return [m.strip().lower() for m in f.readlines() if m.strip()]
|
| 27 |
+
except Exception:
|
| 28 |
+
return None
|
| 29 |
+
return None
|
| 30 |
+
|
| 31 |
+
|
| 32 |
+
def clean_text_basic(text):
|
| 33 |
+
if not text:
|
| 34 |
+
return ""
|
| 35 |
+
# Remove captions like "Ảnh: ..." "Video: ..."
|
| 36 |
+
text = re.sub(r'^.*(Ảnh|Video|Clip|Nguồn)\s*:[^(\n)]*.*$', '', text, flags=re.MULTILINE | re.IGNORECASE)
|
| 37 |
+
text = re.sub(r'\(?\[?(Ảnh|Video|Clip)\s*:[^)]+[\)\]]?', '', text, flags=re.IGNORECASE)
|
| 38 |
+
text = re.sub(r'\n\s*[A-ZÁÀẢÃẠÂĂÊÔƠƯĐ\s\.]{2,50}$', '', text.strip(), flags=re.MULTILINE)
|
| 39 |
+
text = re.sub(r'[ \t]+', ' ', text)
|
| 40 |
+
return text.strip()
|
| 41 |
+
|
| 42 |
+
|
| 43 |
+
def split_sentences_fallback(text):
|
| 44 |
+
sentences = re.split(r'(?<=[.!?])\s+', text)
|
| 45 |
+
return [s.strip() for s in sentences if len(s.strip()) > 15]
|
| 46 |
+
|
| 47 |
+
|
| 48 |
+
class ExtractiveSummarizer:
|
| 49 |
+
def __init__(self, stopwords_path=None):
|
| 50 |
+
self.stopwords = load_stopwords(stopwords_path)
|
| 51 |
+
|
| 52 |
+
# If vncorenlp is available, try to initialize (may require model download previously)
|
| 53 |
+
self.rdrsegmenter = None
|
| 54 |
+
if _VNCORENLP_AVAILABLE:
|
| 55 |
+
try:
|
| 56 |
+
# Use default model dir if available in environment; if not, py_vncorenlp will try to download
|
| 57 |
+
self.rdrsegmenter = py_vncorenlp.VnCoreNLP()
|
| 58 |
+
except Exception:
|
| 59 |
+
self.rdrsegmenter = None
|
| 60 |
+
|
| 61 |
+
def process_text_vncorenlp(self, text):
|
| 62 |
+
text = clean_text_basic(text)
|
| 63 |
+
paragraphs = [p.strip() for p in text.replace('\r\n', '\n').replace('\r', '\n').split('\n') if p.strip()]
|
| 64 |
+
processed_sentences = []
|
| 65 |
+
if self.rdrsegmenter:
|
| 66 |
+
try:
|
| 67 |
+
for p in paragraphs:
|
| 68 |
+
sentences = self.rdrsegmenter.word_segment(p)
|
| 69 |
+
for s in sentences:
|
| 70 |
+
raw_sent = s.replace("_", " ")
|
| 71 |
+
if len(raw_sent) > 15 and any(c.isalpha() for c in raw_sent):
|
| 72 |
+
processed_sentences.append({'raw': raw_sent, 'segmented': s})
|
| 73 |
+
except Exception:
|
| 74 |
+
processed_sentences = []
|
| 75 |
+
|
| 76 |
+
if not processed_sentences:
|
| 77 |
+
# fallback
|
| 78 |
+
raw_sents = split_sentences_fallback(text)
|
| 79 |
+
processed_sentences = [{'raw': s, 'segmented': s} for s in raw_sents]
|
| 80 |
+
|
| 81 |
+
return processed_sentences
|
| 82 |
+
|
| 83 |
+
def summarize(self, text, top_n=3):
|
| 84 |
+
if not text or not text.strip():
|
| 85 |
+
return ""
|
| 86 |
+
sent_data = self.process_text_vncorenlp(text)
|
| 87 |
+
if not sent_data:
|
| 88 |
+
return ""
|
| 89 |
+
if len(sent_data) <= top_n:
|
| 90 |
+
# If text too short, return original cleaned text
|
| 91 |
+
return " ".join([s['raw'] for s in sent_data])
|
| 92 |
+
|
| 93 |
+
corpus = [item['segmented'] for item in sent_data]
|
| 94 |
+
try:
|
| 95 |
+
vectorizer = TfidfVectorizer(stop_words=self.stopwords)
|
| 96 |
+
tfidf_matrix = vectorizer.fit_transform(corpus)
|
| 97 |
+
except Exception:
|
| 98 |
+
return sent_data[0]['raw'] if sent_data else text
|
| 99 |
+
|
| 100 |
+
similarity_matrix = cosine_similarity(tfidf_matrix, tfidf_matrix)
|
| 101 |
+
nx_graph = nx.from_numpy_array(similarity_matrix)
|
| 102 |
+
try:
|
| 103 |
+
scores = nx.pagerank(nx_graph, max_iter=500)
|
| 104 |
+
except Exception:
|
| 105 |
+
scores = {i: 1 for i in range(len(sent_data))}
|
| 106 |
+
|
| 107 |
+
ranked_sentences = sorted(((scores[i], sent_data[i]['raw'], i)
|
| 108 |
+
for i in range(len(sent_data))), reverse=True)
|
| 109 |
+
selected_sentences = ranked_sentences[:top_n]
|
| 110 |
+
selected_sentences.sort(key=lambda x: x[2])
|
| 111 |
+
summary = " ".join([s for _, s, _ in selected_sentences])
|
| 112 |
+
return summary
|
requirements.txt
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
gradio>=3.59.2
|
| 2 |
+
numpy
|
| 3 |
+
|
| 4 |
+
# Quan trọng: Bỏ giới hạn phiên bản để HF tự cài bản mới nhất (có chứa keras.src)
|
| 5 |
+
tensorflow
|
| 6 |
+
keras
|
| 7 |
+
|
| 8 |
+
# Các thư viện hỗ trợ
|
| 9 |
+
torch
|
| 10 |
+
transformers
|
| 11 |
+
sentencepiece
|
| 12 |
+
rouge-score
|
| 13 |
+
matplotlib
|
| 14 |
+
seaborn
|
| 15 |
+
scikit-learn
|
| 16 |
+
pandas
|
| 17 |
+
nltk
|
| 18 |
+
networkx
|
| 19 |
+
Pillow
|
| 20 |
+
py-vncorenlp
|
| 21 |
+
h5py
|