htNghiaaa's picture
Add README.md
621fe43 verified
|
Raw
History Blame Contribute Delete
3.44 kB
---
language:
- vi
license: mit
tags:
- recommendation
- vietnamese
- phobert
- content-based
- news
datasets:
- news-dataset-vietnameses
---
# PhoBERT Vietnamese News Recommendation Model
This model is fine-tuned from `vinai/phobert-base` for Vietnamese news recommendation using contrastive learning on news categories.
## Dataset Structure
The model was trained on a Vietnamese news dataset with the following columns:
- `URL`: Article URL
- `Title`: Article title
- `Summary`: Article summary
- `Contents`: Full article content
- `Date`: Publication date
- `Author(s)`: Article author(s)
- `Category`: Article category (used as labels)
- `Tags`: Related tags
## Model Details
- **Base Model**: vinai/phobert-base
- **Task**: Content-Based News Recommendation
- **Language**: Vietnamese
- **Method**: Classification-based contrastive learning + FAISS similarity search
- **Input**: Title + Summary (concatenated)
## Usage
### Load Model and Generate Recommendations
```python
import torch
from transformers import AutoTokenizer, AutoModelForSequenceClassification
import faiss
import numpy as np
import pickle
from sklearn.preprocessing import normalize
from huggingface_hub import hf_hub_download
# Load model and tokenizer
model_name = "htNghiaaa/phobert-vietnamese-recommendation-1"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForSequenceClassification.from_pretrained(model_name)
# Load FAISS index and metadata
index_path = hf_hub_download(repo_id=model_name, filename="faiss_index.index")
metadata_path = hf_hub_download(repo_id=model_name, filename="metadata.pkl")
index = faiss.read_index(index_path)
with open(metadata_path, "rb") as f:
metadata = pickle.load(f)
# Function to get embeddings
def get_embedding(text):
inputs = tokenizer(text, return_tensors="pt", truncation=True, padding=True, max_length=256)
with torch.no_grad():
outputs = model.roberta(**inputs)
embedding = outputs.last_hidden_state.mean(dim=1).numpy()
return normalize(embedding, norm='l2').astype('float32')
# Function to get recommendations
def get_recommendations(query_text, top_k=5):
query_embedding = get_embedding(query_text)
similarities, indices = index.search(query_embedding, top_k)
results = []
for sim, idx in zip(similarities[0], indices[0]):
results.append({
'title': metadata['titles'][idx],
'summary': metadata['summaries'][idx],
'category': metadata['categories'][idx],
'tags': metadata['tags'][idx],
'url': metadata['urls'][idx],
'similarity': float(sim)
})
return results
# Example
recommendations = get_recommendations("Bóng đá Việt Nam")
for rec in recommendations:
print(f"[{rec['category']}] {rec['title']} (sim: {rec['similarity']:.4f})")
```
## Training Details
- **Model**: vinai/phobert-base
- **Training Method**: Classification on news categories
- **Embedding Method**: Mean pooling of last hidden state
- **Similarity Metric**: Cosine similarity (via FAISS)
- **GPU**: NVIDIA P100/T4
- **Batch Size**: 16
- **Epochs**: 3
## Files Included
- Model weights and config
- Tokenizer files
- `faiss_index.index`: FAISS index for similarity search
- `embeddings.npy`: Pre-computed embeddings
- `metadata.pkl`: Article metadata (urls, titles, summaries, categories, tags, authors, dates)
- `label_encoder.pkl`: Category label encoder