junnyu commited on
Commit
b8625f7
1 Parent(s): e4dee08

Update README.md

Browse files
Files changed (1) hide show
  1. README.md +69 -5
README.md CHANGED
@@ -7,9 +7,73 @@ tags:
7
  widget:
8
  - text: "今天[MASK]很好,我想去公园玩!"
9
  ---
10
- ## 介绍
11
- ### tf版本
12
- https://github.com/ZhuiyiTechnology/roformer
13
 
14
- ### pytorch版本+tf2.0版本
15
- https://github.com/JunnYu/RoFormer_pytorch
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7
  widget:
8
  - text: "今天[MASK]很好,我想去公园玩!"
9
  ---
 
 
 
10
 
11
+ # 下载这个roformer代码
12
+ - https://github.com/JunnYu/RoFormer_pytorch/files/8402725/roformer.zip
13
+
14
+ # 使用
15
+ ```python
16
+ import torch
17
+ import numpy as np
18
+ from roformer import RoFormerForCausalLM, RoFormerConfig
19
+ from transformers import BertTokenizer
20
+
21
+ device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')
22
+ pretrained_model = "junnyu/roformer_chinese_sim_char_base"
23
+ tokenizer = RoFormerTokenizer.from_pretrained(pretrained_model)
24
+ config = RoFormerConfig.from_pretrained(pretrained_model)
25
+ config.is_decoder = True
26
+ config.eos_token_id = tokenizer.sep_token_id
27
+ config.pooler_activation = "linear"
28
+ model = RoFormerForCausalLM.from_pretrained(pretrained_model, config=config)
29
+ model.to(device)
30
+ model.eval()
31
+
32
+ def gen_synonyms(text, n=100, k=20):
33
+ ''''含义: 产生sent的n个相似句,然后返回最相似的k个。
34
+ 做法:用seq2seq生成,并用encoder算相似度并排序。
35
+ '''
36
+ # 寻找所有相似的句子
37
+ r = []
38
+ inputs1 = tokenizer(text, return_tensors="pt")
39
+ for _ in range(n):
40
+ inputs1.to(device)
41
+ output = tokenizer.batch_decode(model.generate(**inputs1, top_p=0.95, do_sample=True, max_length=128), skip_special_tokens=True)[0].replace(" ","").replace(text, "") # 去除空格,去除原始text文本。
42
+ r.append(output)
43
+
44
+ # 对相似的句子进行排序
45
+ r = [i for i in set(r) if i != text and len(i) > 0]
46
+ r = [text] + r
47
+ inputs2 = tokenizer(r, padding=True, return_tensors="pt")
48
+ with torch.no_grad():
49
+ inputs2.to(device)
50
+ outputs = model(**inputs2)
51
+ Z = outputs.pooler_output.cpu().numpy()
52
+ Z /= (Z**2).sum(axis=1, keepdims=True)**0.5
53
+ argsort = np.dot(Z[1:], -Z[0]).argsort()
54
+
55
+ return [r[i + 1] for i in argsort[:k]]
56
+
57
+ out = gen_synonyms("广州和深圳哪个好?")
58
+ print(out)
59
+ # ['深圳和广州哪个好?',
60
+ # '广州和深圳哪个好',
61
+ # '深圳和广州哪个好',
62
+ # '深圳和广州哪个比较好。',
63
+ # '深圳和广州哪个最好?',
64
+ # '深圳和广州哪个比较好',
65
+ # '广州和深圳那个比较好',
66
+ # '深圳和广州哪个更好?',
67
+ # '深圳与广州哪个好',
68
+ # '深圳和广州,哪个比较好',
69
+ # '广州与深圳比较哪个好',
70
+ # '深圳和广州哪里比较好',
71
+ # '深圳还是广州比较好?',
72
+ # '广州和深圳哪个地方好一些?',
73
+ # '广州好还是深圳好?',
74
+ # '广州好还是深圳好呢?',
75
+ # '广州与深圳哪个地方好点?',
76
+ # '深圳好还是广州好',
77
+ # '广州好还是深圳好',
78
+ # '广州和深圳哪个城市好?']
79
+ ```