๐ TAACO_Similarity
This model is based on Sentence-transformers and trained on the STS (Sentence Textual Similarity) dataset of KLUE. It was developed to measure the semantic cohesion between Korean sentences, which is one of the indicators of K-TAACO (tentative name), a tool for measuring the cohesion between Korean sentences developed by the author. Additionally, further training will be carried out using various data such as sentence similarity data from the Modu Corpus.
๐ Quick Start
โจ Features
- Based on Sentence-transformers.
- Trained on the KLUE STS dataset.
- Used for measuring semantic cohesion between Korean sentences.
๐ฆ Installation
To use this model, you need to install Sentence-transformers:
pip install -U sentence-transformers
๐ป Usage Examples
Basic Usage
from sentence_transformers import SentenceTransformer, models
sentences = ["This is an example sentence", "Each sentence is converted"]
embedding_model = models.Transformer(
model_name_or_path="KDHyun08/TAACO_STS",
max_seq_length=256,
do_lower_case=True
)
pooling_model = models.Pooling(
embedding_model.get_word_embedding_dimension(),
pooling_mode_mean_tokens=True,
pooling_mode_cls_token=False,
pooling_mode_max_tokens=False,
)
model = SentenceTransformer(modules=[embedding_model, pooling_model])
embeddings = model.encode(sentences)
print(embeddings)
Advanced Usage
After installing Sentence-transformers, you can compare the similarity between sentences as follows. The query
variable is the source sentence for comparison, and the sentences to be compared should be organized in a list in docs
.
from sentence_transformers import SentenceTransformer, models
import torch
from sentence_transformers import util
docs = ['์ด์ ๋ ์๋ด์ ์์ผ์ด์๋ค', '์์ผ์ ๋ง์ดํ์ฌ ์์นจ์ ์ค๋นํ๊ฒ ๋ค๊ณ ์ค์ 8์ 30๋ถ๋ถํฐ ์์์ ์ค๋นํ์๋ค. ์ฃผ๋ ๋ฉ๋ด๋ ์คํ
์ดํฌ์ ๋์ง๋ณถ์, ๋ฏธ์ญ๊ตญ, ์ก์ฑ, ์์ผ ๋ฑ์ด์๋ค', '์คํ
์ดํฌ๋ ์์ฃผ ํ๋ ์์์ด์ด์ ์์ ์ด ์ค๋นํ๋ ค๊ณ ํ๋ค', '์๋ค๋ 1๋ถ์ฉ 3๋ฒ ๋ค์ง๊ณ ๋์คํ
์ ์ ํ๋ฉด ์ก์ฆ์ด ๊ฐ๋ํ ์คํ
์ดํฌ๊ฐ ์ค๋น๋๋ค', '์๋ด๋ ๊ทธ๋ฐ ์คํ
์ดํฌ๋ฅผ ์ข์ํ๋ค. ๊ทธ๋ฐ๋ฐ ์์๋ ๋ชปํ ์ผ์ด ๋ฒ์ด์ง๊ณ ๋ง์๋ค', '๋ณดํต ์์ฆ๋์ด ๋์ง ์์ ์์ก์ ์ฌ์ ์คํ
์ดํฌ๋ฅผ ํ๋๋ฐ, ์ด๋ฒ์๋ ์์ฆ๋์ด ๋ ๋ถ์ฑ์ด์ ๊ตฌ์
ํด์ ํ๋ค', '๊ทธ๋ฐ๋ฐ ์ผ์ด์ค ์์ ๋ฐฉ๋ถ์ ๊ฐ ๋ค์ด์๋ ๊ฒ์ ์ธ์งํ์ง ๋ชปํ๊ณ ๋ฐฉ๋ถ์ ์ ๋์์ ํ๋ผ์ดํฌ์ ์ฌ๋ ค๋์ ๊ฒ์ด๋ค', '๊ทธ๊ฒ๋ ์ธ์ง ๋ชปํ ์ฒด... ์๋ฉด์ ์ผ ๋ถ์ 1๋ถ์ ๊ตฝ๊ณ ๋ค์ง๋ ์๊ฐ ๋ฐฉ๋ถ์ ๊ฐ ํจ๊ป ๊ตฌ์ด์ง ๊ฒ์ ์์๋ค', '์๋ด์ ์์ผ์ด๋ผ ๋ง์๊ฒ ๊ตฌ์๋ณด๊ณ ์ถ์๋๋ฐ ์ด์ฒ๊ตฌ๋์๋ ์ํฉ์ด ๋ฐ์ํ ๊ฒ์ด๋ค', '๋ฐฉ๋ถ์ ๊ฐ ์ผ ๋ถ์ ๋
น์์ ๊ทธ๋ฐ์ง ๋ฌผ์ฒ๋ผ ํ๋ฌ๋ด๋ ธ๋ค', ' ๊ณ ๋ฏผ์ ํ๋ค. ๋ฐฉ๋ถ์ ๊ฐ ๋ฌป์ ๋ถ๋ฌธ๋ง ์ ๊ฑฐํ๊ณ ๋ค์ ๊ตฌ์ธ๊น ํ๋๋ฐ ๋ฐฉ๋ถ์ ์ ์ ๋ ๋จน์ง ๋ง๋ผ๋ ๋ฌธ๊ตฌ๊ฐ ์์ด์ ์๊น์ง๋ง ๋ฒ๋ฆฌ๋ ๋ฐฉํฅ์ ํ๋ค', '๋๋ฌด๋ ์ํ๊น์ ๋ค', '์์นจ ์ผ์ฐ ์๋ด๊ฐ ์ข์ํ๋ ์คํ
์ดํฌ๋ฅผ ์ค๋นํ๊ณ ๊ทธ๊ฒ์ ๋ง์๊ฒ ๋จน๋ ์๋ด์ ๋ชจ์ต์ ๋ณด๊ณ ์ถ์๋๋ฐ ์ ํ ์๊ฐ์ง๋ ๋ชปํ ์ํฉ์ด ๋ฐ์ํด์... ํ์ง๋ง ์ ์ ์ ์ถ์ค๋ฅด๊ณ ๋ฐ๋ก ๋ค๋ฅธ ๋ฉ๋ด๋ก ๋ณ๊ฒฝํ๋ค', '์์ผ, ์์์ง ์ผ์ฑ๋ณถ์..', '์๋ด๊ฐ ์ข์ํ๋์ง ๋ชจ๋ฅด๊ฒ ์ง๋ง ๋์ฅ๊ณ ์์ ์๋ ํ๋ํฌ์์ธ์ง๋ฅผ ๋ณด๋ ๋ฐ๋ก ์์ผ๋ฅผ ํด์ผ๊ฒ ๋ค๋ ์๊ฐ์ด ๋ค์๋ค. ์์์ ์ฑ๊ณต์ ์ผ๋ก ์์ฑ์ด ๋์๋ค', '40๋ฒ์งธ๋ฅผ ๋ง์ดํ๋ ์๋ด์ ์์ผ์ ์ฑ๊ณต์ ์ผ๋ก ์ค๋น๊ฐ ๋์๋ค', '๋ง์๊ฒ ๋จน์ด ์ค ์๋ด์๊ฒ๋ ๊ฐ์ฌํ๋ค', '๋งค๋
์๋ด์ ์์ผ์ ๋ง์ดํ๋ฉด ์์นจ๋ง๋ค ์์ผ์ ์ฐจ๋ ค์ผ๊ฒ ๋ค. ์ค๋๋ ์ฆ๊ฑฐ์ด ํ๋ฃจ๊ฐ ๋์์ผ๋ฉด ์ข๊ฒ ๋ค', '์์ผ์ด๋๊น~']
document_embeddings = model.encode(docs)
query = '์์ผ์ ๋ง์ดํ์ฌ ์์นจ์ ์ค๋นํ๊ฒ ๋ค๊ณ ์ค์ 8์ 30๋ถ๋ถํฐ ์์์ ์ค๋นํ์๋ค'
query_embedding = model.encode(query)
top_k = min(10, len(docs))
cos_scores = util.pytorch_cos_sim(query_embedding, document_embeddings)[0]
top_results = torch.topk(cos_scores, k=top_k)
print(f"Input sentence: {query}")
print(f"\n<Top {top_k} sentences similar to the input sentence>\n")
for i, (score, idx) in enumerate(zip(top_results[0], top_results[1])):
print(f"{i+1}: {docs[idx]} (Similarity: {score:.4f})\n")
๐ Documentation
Train Data
- KLUE-sts-v1.1._train.json
- NLI-sts-train.tsv
Evaluation Results
When you run the above usage examples, the following results will be obtained. The closer the value is to 1, the more similar the sentences are.
Input sentence: ์์ผ์ ๋ง์ดํ์ฌ ์์นจ์ ์ค๋นํ๊ฒ ๋ค๊ณ ์ค์ 8์ 30๋ถ๋ถํฐ ์์์ ์ค๋นํ์๋ค
<Top 10 sentences similar to the input sentence>
1: ์์ผ์ ๋ง์ดํ์ฌ ์์นจ์ ์ค๋นํ๊ฒ ๋ค๊ณ ์ค์ 8์ 30๋ถ๋ถํฐ ์์์ ์ค๋นํ์๋ค. ์ฃผ๋ ๋ฉ๋ด๋ ์คํ
์ดํฌ์ ๋์ง๋ณถ์, ๋ฏธ์ญ๊ตญ, ์ก์ฑ, ์์ผ ๋ฑ์ด์๋ค (Similarity: 0.6687)
2: ๋งค๋
์๋ด์ ์์ผ์ ๋ง์ดํ๋ฉด ์์นจ๋ง๋ค ์์ผ์ ์ฐจ๋ ค์ผ๊ฒ ๋ค. ์ค๋๋ ์ฆ๊ฑฐ์ด ํ๋ฃจ๊ฐ ๋์์ผ๋ฉด ์ข๊ฒ ๋ค (Similarity: 0.6468)
3: 40๋ฒ์งธ๋ฅผ ๋ง์ดํ๋ ์๋ด์ ์์ผ์ ์ฑ๊ณต์ ์ผ๋ก ์ค๋น๊ฐ ๋์๋ค (Similarity: 0.4647)
4: ์๋ด์ ์์ผ์ด๋ผ ๋ง์๊ฒ ๊ตฌ์๋ณด๊ณ ์ถ์๋๋ฐ ์ด์ฒ๊ตฌ๋์๋ ์ํฉ์ด ๋ฐ์ํ ๊ฒ์ด๋ค (Similarity: 0.4469)
5: ์์ผ์ด๋๊น~ (Similarity: 0.4218)
6: ์ด์ ๋ ์๋ด์ ์์ผ์ด์๋ค (Similarity: 0.4192)
7: ์์นจ ์ผ์ฐ ์๋ด๊ฐ ์ข์ํ๋ ์คํ
์ดํฌ๋ฅผ ์ค๋นํ๊ณ ๊ทธ๊ฒ์ ๋ง์๊ฒ ๋จน๋ ์๋ด์ ๋ชจ์ต์ ๋ณด๊ณ ์ถ์๋๋ฐ ์ ํ ์๊ฐ์ง๋ ๋ชปํ ์ํฉ์ด ๋ฐ์ํด์... ํ์ง๋ง ์ ์ ์ ์ถ์ค๋ฅด๊ณ ๋ฐ๋ก ๋ค๋ฅธ ๋ฉ๋ด๋ก ๋ณ๊ฒฝํ๋ค (Similarity: 0.4156)
8: ๋ง์๊ฒ ๋จน์ด ์ค ์๋ด์๊ฒ๋ ๊ฐ์ฌํ๋ค (Similarity: 0.3093)
9: ์๋ด๊ฐ ์ข์ํ๋์ง ๋ชจ๋ฅด๊ฒ ์ง๋ง ๋์ฅ๊ณ ์์ ์๋ ํ๋ํฌ์์ธ์ง๋ฅผ ๋ณด๋ ๋ฐ๋ก ์์ผ๋ฅผ ํด์ผ๊ฒ ๋ค๋ ์๊ฐ์ด ๋ค์๋ค. ์์์ ์ฑ๊ณต์ ์ผ๋ก ์์ฑ์ด ๋์๋ค (Similarity: 0.2259)
10: ์๋ด๋ ๊ทธ๋ฐ ์คํ
์ดํฌ๋ฅผ ์ข์ํ๋ค. ๊ทธ๋ฐ๋ฐ ์์๋ ๋ชปํ ์ผ์ด ๋ฒ์ด์ง๊ณ ๋ง์๋ค (Similarity: 0.1967)
๐ง Technical Details
DataLoader
torch.utils.data.dataloader.DataLoader
of length 142 with parameters:
{'batch_size': 32, 'sampler': 'torch.utils.data.sampler.RandomSampler', 'batch_sampler': 'torch.utils.data.sampler.BatchSampler'}
Loss
sentence_transformers.losses.CosineSimilarityLoss.CosineSimilarityLoss
Parameters of the fit()-Method:
{
"epochs": 4,
"evaluation_steps": 1000,
"evaluator": "sentence_transformers.evaluation.EmbeddingSimilarityEvaluator.EmbeddingSimilarityEvaluator",
"max_grad_norm": 1,
"optimizer_class": "<class 'transformers.optimization.AdamW'>",
"optimizer_params": {
"lr": 2e-05
},
"scheduler": "WarmupLinear",
"steps_per_epoch": null,
"warmup_steps": 10000,
"weight_decay": 0.01
}
Full Model Architecture
SentenceTransformer(
(0): Transformer({'max_seq_length': 512, 'do_lower_case': False}) with Transformer model: BertModel
(1): Pooling({'word_embedding_dimension': 768, 'pooling_mode_cls_token': False, 'pooling_mode_mean_tokens': True, 'pooling_mode_max_tokens': False, 'pooling_mode_mean_sqrt_len_tokens': False})
)
๐ License
No license information provided in the original document.
Citing & Authors