KDHyun08 commited on
Commit
752d6bc
·
1 Parent(s): 8fffa58

Upload with huggingface_hub

Browse files
README.md CHANGED
@@ -2,130 +2,85 @@
2
  pipeline_tag: sentence-similarity
3
  tags:
4
  - sentence-transformers
 
5
  - sentence-similarity
6
  - transformers
7
- - TAACO
8
- language: ko
9
  ---
10
 
11
- # TAACO_Similarity
12
 
13
- 모델은 [Sentence-transformers](https://www.SBERT.net) 기반으로 하며 KLUE의 STS(Sentence Textual Similarity) 데이터셋을 통해 훈련을 진행한 모델입니다.
14
- 필자가 제작하고 있는 한국어 문장간 결속성 측정 도구인 K-TAACO(가제)의 지표 중 하나인 문장 간 의미적 결속성을 측정하기 위해 본 모델을 제작하였습니다.
15
- 또한 모두의 말뭉치의 문장간 유사도 데이터 등 다양한 데이터를 구해 추가 훈련을 진행할 예정입니다.
16
 
17
- ## Train Data
18
- KLUE-sts-v1.1._train.json
19
- NLI-sts-train.tsv
20
 
21
  ## Usage (Sentence-Transformers)
22
 
23
- 모델을 사용하기 위해서는 [Sentence-transformers](https://www.SBERT.net) 설치하여야 합니다.
24
 
25
  ```
26
  pip install -U sentence-transformers
27
  ```
28
 
29
- 모델을 사용하기 위해서는 아래 코드를 참조하시길 바랍니다.
30
 
31
  ```python
32
- from sentence_transformers import SentenceTransformer, models
33
  sentences = ["This is an example sentence", "Each sentence is converted"]
34
 
35
- embedding_model = models.Transformer(
36
- model_name_or_path="KDHyun08/TAACO_STS",
37
- max_seq_length=256,
38
- do_lower_case=True
39
- )
40
-
41
- pooling_model = models.Pooling(
42
- embedding_model.get_word_embedding_dimension(),
43
- pooling_mode_mean_tokens=True,
44
- pooling_mode_cls_token=False,
45
- pooling_mode_max_tokens=False,
46
- )
47
- model = SentenceTransformer(modules=[embedding_model, pooling_model])
48
-
49
  embeddings = model.encode(sentences)
50
  print(embeddings)
51
  ```
52
 
53
 
54
- ## Usage (실제 문장 간 유사도 비교)
55
- [Sentence-transformers](https://www.SBERT.net) 설치한 후 아래 내용과 같이 문장 간 유사도를 비교할 수 있습니다.
56
- query 변수는 비교 기준이 되는 문장(Source Sentence)이고 비교를 진행할 문장은 docs에 list 형식으로 구성하시면 됩니다.
57
 
58
  ```python
59
- from sentence_transformers import SentenceTransformer, models
 
60
 
61
- embedding_model = models.Transformer(
62
- model_name_or_path="KDHyun08/TAACO_STS",
63
- max_seq_length=256,
64
- do_lower_case=True
65
- )
66
 
67
- pooling_model = models.Pooling(
68
- embedding_model.get_word_embedding_dimension(),
69
- pooling_mode_mean_tokens=True,
70
- pooling_mode_cls_token=False,
71
- pooling_mode_max_tokens=False,
72
- )
73
- model = SentenceTransformer(modules=[embedding_model, pooling_model])
74
 
75
- docs = ['어제는 아내의 생일이었다', '생일을 맞이하여 아침을 준비하겠다고 오전 8시 30분부터 음식을 준비하였다. 주된 메뉴는 스테이크와 낙지볶음, 미역국, 잡채, 소야 등이었다', '스테이크는 자주 하는 음식이어서 자신이 준비하려고 했다', '앞뒤도 1분씩 3번 뒤집고 래스팅을 잘 하면 육즙이 가득한 스테이크가 준비되다', '아내도 그런 스테이크를 좋아한다. 그런데 상상도 못한 일이 벌이지고 말았다', '보통 시즈닝이 되지 않은 원육을 사서 스테이크를 했는데, 이번에는 시즈닝이 된 부챗살을 구입해서 했다', '그런데 케이스 안에 방부제가 들어있는 것을 인지하지 못하고 방부제와 동시에 프라이팬에 올려놓을 것이다', '그것도 인지 못한 체... 앞면을 센 불에 1분을 굽고 뒤집는 순간 방부제가 함께 구어진 것을 알았다', '아내의 생일이라 맛있게 구워보고 싶었는데 어처구니없는 상황이 발생한 것이다', '방부제가 센 불에 녹아서 그런지 물처럼 흘러내렸다', ' 고민을 했다. 방부제가 묻은 부문만 제거하고 다시 구울까 했는데 방부제에 절대 먹지 말라는 문구가 ��어서 아깝지만 버리는 방향을 했다', '너무나 안타까웠다', '아침 일찍 아내가 좋아하는 스테이크를 준비하고 그것을 맛있게 먹는 아내의 모습을 보고 싶었는데 전혀 생각지도 못한 상황이 발생해서... 하지만 정신을 추스르고 바로 다른 메뉴로 변경했다', '소야, 소시지 야채볶음..', '아내가 좋아하는지 모르겠지만 냉장고 안에 있는 후랑크소세지를 보니 바로 소야를 해야겠다는 생각이 들었다. 음식은 성공적으로 완성이 되었다', '40번째를 맞이하는 아내의 생일은 성공적으로 준비가 되었다', '맛있게 먹어 준 아내에게도 감사했다', '매년 아내의 생일에 맞이하면 아침마다 생일을 차려야겠다. 오늘도 즐거운 하루가 되었으면 좋겠다', '생일이니까~']
76
- #각 문장의 vector값 encoding
77
- document_embeddings = model.encode(docs)
78
 
79
- query = '생일을 맞이하여 아침을 준비하겠다고 오전 8시 30분부터 음식을 준비하였다'
80
- query_embedding = model.encode(query)
81
 
82
- top_k = min(10, len(docs))
 
 
83
 
84
- # 코사인 유사도 계산 후,
85
- cos_scores = util.pytorch_cos_sim(query_embedding, document_embeddings)[0]
86
 
87
- # 코사인 유사도 순으로 문장 추출
88
- top_results = torch.topk(cos_scores, k=top_k)
 
89
 
90
- print(f"입력 문장: {query}")
91
- print(f"\n<입력 문장과 유사한 {top_k} 개의 문장>\n")
92
 
93
- for i, (score, idx) in enumerate(zip(top_results[0], top_results[1])):
94
- print(f"{i+1}: {docs[idx]} {'(유사도: {:.4f})'.format(score)}\n")
95
  ```
96
 
97
 
98
 
99
  ## Evaluation Results
100
 
101
- Usage를 실행하게 되면 아래와 같은 결과가 도출됩니다. 1에 가까울수록 유사한 문장입니다.
102
-
103
- ```
104
- 입력 문장: 생일을 맞이하여 아침을 준비하겠다고 오전 8시 30분부터 음식을 준비하였다
105
-
106
- <입력 문장과 유사한 10 개의 문장>
107
 
108
- 1: 생일을 맞이하여 아침을 준비하겠다고 오전 8시 30분부터 음식을 준비하였다. 주된 메뉴는 스테이크와 낙지볶음, 미역국, 잡채, 소야 등이었다 (유사도: 0.6687)
109
 
110
- 2: 매년 아내의 생일에 맞이하면 아침마다 생일을 차려야겠다. 오늘도 즐거운 하루가 되었으면 좋겠다 (유사도: 0.6468)
111
-
112
- 3: 40번째를 맞이하는 아내의 생일은 성공적으로 준비가 되었다 (유사도: 0.4647)
113
-
114
- 4: 아내의 생일이라 맛있게 구워보고 싶었는데 어처구니없는 상황이 발생한 것이다 (유사도: 0.4469)
115
-
116
- 5: 생일이니까~ (유사도: 0.4218)
117
-
118
- 6: 어제는 아내의 생일이었다 (유사도: 0.4192)
119
-
120
- 7: 아침 일찍 아내가 좋아하는 스테이크를 준비하고 그것을 맛있게 먹는 아내의 모습을 보고 싶었는데 전혀 생각지도 못한 상황이 발생해서... 하지만 정신을 추스르고 바로 다른 메뉴로 변경했다 (유사도: 0.4156)
121
-
122
- 8: 맛있게 먹어 준 아내에게도 감사했다 (유사도: 0.3093)
123
-
124
- 9: 아내가 좋아하는지 모르겠지만 냉장고 안에 있는 후랑크소세지를 보니 바로 소야를 해야겠다는 생각이 들었다. 음식은 성공적으로 완성이 되었다 (유사도: 0.2259)
125
-
126
- 10: 아내도 그런 스테이크를 좋아한다. 그런데 상상도 못한 일이 벌이지고 말았다 (유사도: 0.1967)
127
- ```
128
 
 
 
129
 
130
  **DataLoader**:
131
 
@@ -142,7 +97,7 @@ Parameters of the fit()-Method:
142
  ```
143
  {
144
  "epochs": 4,
145
- "evaluation_steps": 1000,
146
  "evaluator": "sentence_transformers.evaluation.EmbeddingSimilarityEvaluator.EmbeddingSimilarityEvaluator",
147
  "max_grad_norm": 1,
148
  "optimizer_class": "<class 'transformers.optimization.AdamW'>",
@@ -160,7 +115,7 @@ Parameters of the fit()-Method:
160
  ## Full Model Architecture
161
  ```
162
  SentenceTransformer(
163
- (0): Transformer({'max_seq_length': 512, 'do_lower_case': False}) with Transformer model: BertModel
164
  (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})
165
  )
166
  ```
 
2
  pipeline_tag: sentence-similarity
3
  tags:
4
  - sentence-transformers
5
+ - feature-extraction
6
  - sentence-similarity
7
  - transformers
 
 
8
  ---
9
 
10
+ # {MODEL_NAME}
11
 
12
+ This is a [sentence-transformers](https://www.SBERT.net) model: It maps sentences & paragraphs to a 768 dimensional dense vector space and can be used for tasks like clustering or semantic search.
 
 
13
 
14
+ <!--- Describe your model here -->
 
 
15
 
16
  ## Usage (Sentence-Transformers)
17
 
18
+ Using this model becomes easy when you have [sentence-transformers](https://www.SBERT.net) installed:
19
 
20
  ```
21
  pip install -U sentence-transformers
22
  ```
23
 
24
+ Then you can use the model like this:
25
 
26
  ```python
27
+ from sentence_transformers import SentenceTransformer
28
  sentences = ["This is an example sentence", "Each sentence is converted"]
29
 
30
+ model = SentenceTransformer('{MODEL_NAME}')
 
 
 
 
 
 
 
 
 
 
 
 
 
31
  embeddings = model.encode(sentences)
32
  print(embeddings)
33
  ```
34
 
35
 
36
+
37
+ ## Usage (HuggingFace Transformers)
38
+ Without [sentence-transformers](https://www.SBERT.net), you can use the model like this: First, you pass your input through the transformer model, then you have to apply the right pooling-operation on-top of the contextualized word embeddings.
39
 
40
  ```python
41
+ from transformers import AutoTokenizer, AutoModel
42
+ import torch
43
 
 
 
 
 
 
44
 
45
+ #Mean Pooling - Take attention mask into account for correct averaging
46
+ def mean_pooling(model_output, attention_mask):
47
+ token_embeddings = model_output[0] #First element of model_output contains all token embeddings
48
+ input_mask_expanded = attention_mask.unsqueeze(-1).expand(token_embeddings.size()).float()
49
+ return torch.sum(token_embeddings * input_mask_expanded, 1) / torch.clamp(input_mask_expanded.sum(1), min=1e-9)
 
 
50
 
 
 
 
51
 
52
+ # Sentences we want sentence embeddings for
53
+ sentences = ['This is an example sentence', 'Each sentence is converted']
54
 
55
+ # Load model from HuggingFace Hub
56
+ tokenizer = AutoTokenizer.from_pretrained('{MODEL_NAME}')
57
+ model = AutoModel.from_pretrained('{MODEL_NAME}')
58
 
59
+ # Tokenize sentences
60
+ encoded_input = tokenizer(sentences, padding=True, truncation=True, return_tensors='pt')
61
 
62
+ # Compute token embeddings
63
+ with torch.no_grad():
64
+ model_output = model(**encoded_input)
65
 
66
+ # Perform pooling. In this case, mean pooling.
67
+ sentence_embeddings = mean_pooling(model_output, encoded_input['attention_mask'])
68
 
69
+ print("Sentence embeddings:")
70
+ print(sentence_embeddings)
71
  ```
72
 
73
 
74
 
75
  ## Evaluation Results
76
 
77
+ <!--- Describe how your model was evaluated -->
 
 
 
 
 
78
 
79
+ For an automated evaluation of this model, see the *Sentence Embeddings Benchmark*: [https://seb.sbert.net](https://seb.sbert.net?model_name={MODEL_NAME})
80
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
81
 
82
+ ## Training
83
+ The model was trained with the parameters:
84
 
85
  **DataLoader**:
86
 
 
97
  ```
98
  {
99
  "epochs": 4,
100
+ "evaluation_steps": 4538,
101
  "evaluator": "sentence_transformers.evaluation.EmbeddingSimilarityEvaluator.EmbeddingSimilarityEvaluator",
102
  "max_grad_norm": 1,
103
  "optimizer_class": "<class 'transformers.optimization.AdamW'>",
 
115
  ## Full Model Architecture
116
  ```
117
  SentenceTransformer(
118
+ (0): Transformer({'max_seq_length': 256, 'do_lower_case': True}) with Transformer model: BertModel
119
  (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})
120
  )
121
  ```
config.json CHANGED
@@ -1,5 +1,5 @@
1
  {
2
- "_name_or_path": "klue/bert-base",
3
  "architectures": [
4
  "BertModel"
5
  ],
 
1
  {
2
+ "_name_or_path": "KDHyun08/TAACO_STS",
3
  "architectures": [
4
  "BertModel"
5
  ],
pytorch_model.bin CHANGED
@@ -1,3 +1,3 @@
1
  version https://git-lfs.github.com/spec/v1
2
- oid sha256:173ff08c5273eed03b1809a9bfb99dcfb4f42f8d2024cea8cb561bd60ff46656
3
  size 442543599
 
1
  version https://git-lfs.github.com/spec/v1
2
+ oid sha256:70d3bfc7b45f4c5d3d33353cfd2d8c6fa3c40943b630cf1edaa8b69c30e79834
3
  size 442543599
sentence_bert_config.json CHANGED
@@ -1,4 +1,4 @@
1
  {
2
- "max_seq_length": 512,
3
- "do_lower_case": false
4
  }
 
1
  {
2
+ "max_seq_length": 256,
3
+ "do_lower_case": true
4
  }
tokenizer.json CHANGED
@@ -2,7 +2,7 @@
2
  "version": "1.0",
3
  "truncation": {
4
  "direction": "Right",
5
- "max_length": 512,
6
  "strategy": "LongestFirst",
7
  "stride": 0
8
  },
 
2
  "version": "1.0",
3
  "truncation": {
4
  "direction": "Right",
5
+ "max_length": 256,
6
  "strategy": "LongestFirst",
7
  "stride": 0
8
  },
tokenizer_config.json CHANGED
@@ -1 +1 @@
1
- {"do_lower_case": false, "unk_token": "[UNK]", "sep_token": "[SEP]", "pad_token": "[PAD]", "cls_token": "[CLS]", "mask_token": "[MASK]", "tokenize_chinese_chars": true, "strip_accents": null, "do_basic_tokenize": true, "never_split": null, "model_max_length": 512, "special_tokens_map_file": "C:\\Users\\DESKTOP/.cache\\huggingface\\transformers\\aeaaa3afd086a040be912f92ffe7b5f85008b744624f4517c4216bcc32b51cf0.054ece8d16bd524c8a00f0e8a976c00d5de22a755ffb79e353ee2954d9289e26", "name_or_path": "klue/bert-base", "tokenizer_class": "BertTokenizer"}
 
1
+ {"do_lower_case": false, "unk_token": "[UNK]", "sep_token": "[SEP]", "pad_token": "[PAD]", "cls_token": "[CLS]", "mask_token": "[MASK]", "tokenize_chinese_chars": true, "strip_accents": null, "do_basic_tokenize": true, "never_split": null, "model_max_length": 512, "special_tokens_map_file": "C:\\Users\\DESKTOP/.cache\\huggingface\\transformers\\aeaaa3afd086a040be912f92ffe7b5f85008b744624f4517c4216bcc32b51cf0.054ece8d16bd524c8a00f0e8a976c00d5de22a755ffb79e353ee2954d9289e26", "name_or_path": "KDHyun08/TAACO_STS", "tokenizer_class": "BertTokenizer"}