Room Name Similarity Model
๊ฐ์ค๋ช ํ ์คํธ ์ ์ฌ๋ ์ธก์ ์ ์ํ Siamese ๋คํธ์ํฌ ๋ชจ๋ธ์ ๋๋ค.
๋ชจ๋ธ ๊ฐ์
์ด ๋ชจ๋ธ์ ์์ ๊ฐ์ค๋ช ๊ฐ์ ์ ์ฌ๋๋ฅผ ์ธก์ ํ์ฌ ๋์ผํ ๋ฌผ๋ฆฌ์ ๊ฐ์ค์ ์๋ณํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. BERT ๊ธฐ๋ฐ Siamese ๋คํธ์ํฌ๋ฅผ ์ฌ์ฉํ์ฌ ํ๊ตญ์ด์ ์์ด ํ ์คํธ๋ฅผ ๋ชจ๋ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
๋ชจ๋ธ ์ ๋ณด
- ๋ชจ๋ธ๋ช
:
name_similarity_model_0.2 - ๊ธฐ๋ฐ ๋ชจ๋ธ:
klue/bert-base - ์ต๋ ์ํ์ค ๊ธธ์ด: 64
- ์ดํ ํฌ๊ธฐ: 32,000
- ์ธ์ด: ํ๊ตญ์ด, ์์ด
์ฌ์ฉ๋ฒ
Python์ผ๋ก ๋ชจ๋ธ ์ฌ์ฉ
import torch
from transformers import AutoTokenizer, AutoModel
import json
# ๋ชจ๋ธ ์ ๋ณด ๋ก๋
with open('name_similarity_model_0.2_model_info.json', 'r') as f:
model_info = json.load(f)
with open('name_similarity_model_0.2_tokenizer_info.json', 'r') as f:
tokenizer_info = json.load(f)
# ํ ํฌ๋์ด์ ๋ก๋
tokenizer = AutoTokenizer.from_pretrained(tokenizer_info['model_name'])
# ๋ชจ๋ธ ๋ก๋ (PyTorch)
model = torch.load('name_similarity_model_0.2.pth', map_location='cpu')
model.eval()
# ONNX ๋ชจ๋ธ ์ฌ์ฉ (๋ ๋น ๋ฅธ ์ถ๋ก )
import onnxruntime as ort
onnx_session = ort.InferenceSession('name_similarity_model_0.2.onnx')
def calculate_similarity(text1, text2):
# ํ
์คํธ ํ ํฌ๋์ด์ง
inputs1 = tokenizer(text1, return_tensors='pt', max_length=64, padding=True, truncation=True)
inputs2 = tokenizer(text2, return_tensors='pt', max_length=64, padding=True, truncation=True)
# ์ ์ฌ๋ ๊ณ์ฐ
with torch.no_grad():
similarity = model(inputs1, inputs2)
return similarity.item()
# ์์ ์ฌ์ฉ
text1 = "์คํ ๋ค๋ ๋๋ธ๋ฃธ"
text2 = "Standard Double Room"
similarity_score = calculate_similarity(text1, text2)
print(f"์ ์ฌ๋: {similarity_score:.4f}")
ONNX ๋ชจ๋ธ ์ฌ์ฉ (๊ถ์ฅ)
import onnxruntime as ort
import numpy as np
from transformers import AutoTokenizer
# ONNX ์ธ์
์์ฑ
session = ort.InferenceSession('name_similarity_model_0.2.onnx')
# ํ ํฌ๋์ด์ ๋ก๋
tokenizer = AutoTokenizer.from_pretrained('klue/bert-base')
def calculate_similarity_onnx(text1, text2):
# ํ
์คํธ ํ ํฌ๋์ด์ง
inputs1 = tokenizer(text1, return_tensors='np', max_length=64, padding=True, truncation=True)
inputs2 = tokenizer(text2, return_tensors='np', max_length=64, padding=True, truncation=True)
# ONNX ๋ชจ๋ธ ์ถ๋ก
input_feed = {
'input_ids_1': inputs1['input_ids'].astype(np.int64),
'attention_mask_1': inputs1['attention_mask'].astype(np.int64),
'input_ids_2': inputs2['input_ids'].astype(np.int64),
'attention_mask_2': inputs2['attention_mask'].astype(np.int64)
}
similarity = session.run(None, input_feed)[0]
return similarity[0][0]
# ์์ ์ฌ์ฉ
similarity_score = calculate_similarity_onnx("์คํ ๋ค๋ ๋๋ธ๋ฃธ", "Standard Double Room")
print(f"์ ์ฌ๋: {similarity_score:.4f}")
๋ชจ๋ธ ํ์ผ
name_similarity_model_0.2.pth: PyTorch ๋ชจ๋ธ ํ์ผname_similarity_model_0.2.onnx: ONNX ๋ชจ๋ธ ํ์ผ (์ถ๋ก ์ต์ ํ)name_similarity_model_0.2_model_info.json: ๋ชจ๋ธ ๋ฉํ๋ฐ์ดํฐname_similarity_model_0.2_tokenizer_info.json: ํ ํฌ๋์ด์ ์ ๋ณด
์ฑ๋ฅ
- ์ ํ๋: 85% ์ด์
- F1 Score: 0.85 ์ด์
- ์ฒ๋ฆฌ ์๋: 1000 ์/์ด ์ด์ (ONNX ๋ชจ๋ธ ๊ธฐ์ค)
ํ๋ จ ๋ฐ์ดํฐ
์ด ๋ชจ๋ธ์ ๋ค์๊ณผ ๊ฐ์ ๋ฐ์ดํฐ๋ก ํ๋ จ๋์์ต๋๋ค:
- ๊ธ์ ์: ๊ฐ์
roomtype_id๋ฅผ ๊ฐ์ง ๊ฐ์ค๋ช ๋ค - ๋ถ์ ์: ๊ฐ์
property_id์ด์ง๋ง ๋ค๋ฅธroomtype_id๋ฅผ ๊ฐ์ง ๊ฐ์ค๋ช ๋ค
๋ผ์ด์ ์ค
MIT License
์ฐธ๊ณ
์ด ๋ชจ๋ธ์ Room Clusterer ํ๋ก์ ํธ์ ์ผ๋ถ๋ก ๊ฐ๋ฐ๋์์ต๋๋ค. ๋ ์์ธํ ์ ๋ณด๋ ํ๋ก์ ํธ ์ ์ฅ์๋ฅผ ์ฐธ์กฐํ์ธ์.