KoichiYasuoka
commited on
Commit
·
603b9d0
1
Parent(s):
784d65d
initial release
Browse files- README.md +25 -0
- config.json +0 -0
- maker.sh +13 -0
- pytorch_model.bin +3 -0
- special_tokens_map.json +37 -0
- tokenizer_config.json +57 -0
- upos.py +41 -0
- vocab.txt +0 -0
README.md
ADDED
@@ -0,0 +1,25 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
---
|
2 |
+
language:
|
3 |
+
- "bo"
|
4 |
+
tags:
|
5 |
+
- "tibetan"
|
6 |
+
- "token-classification"
|
7 |
+
- "pos"
|
8 |
+
base_model: KoichiYasuoka/bert-base-tibetan
|
9 |
+
license: "apache-2.0"
|
10 |
+
pipeline_tag: "token-classification"
|
11 |
+
---
|
12 |
+
|
13 |
+
# bert-base-tibetan-upos
|
14 |
+
|
15 |
+
## Model Description
|
16 |
+
|
17 |
+
This is a BERT model for POS-tagging, derived from [bert-base-tibetan](https://huggingface.co/KoichiYasuoka/bert-base-tibetan). Every word is tagged by [UPOS](https://universaldependencies.org/u/pos/) (Universal Part-Of-Speech).
|
18 |
+
|
19 |
+
## How to Use
|
20 |
+
|
21 |
+
```py
|
22 |
+
from transformers import pipeline
|
23 |
+
nlp=pipeline("upos","KoichiYasuoka/bert-base-tibetan-upos",trust_remote_code=True,aggregation_strategy="simple")
|
24 |
+
```
|
25 |
+
|
config.json
ADDED
The diff for this file is too large to render.
See raw diff
|
|
maker.sh
ADDED
@@ -0,0 +1,13 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#! /bin/sh
|
2 |
+
for D in classical-tibetan-corpus old-tibetan-corpus modern-tibetan-corpus
|
3 |
+
do test -d $D || git clone --depth=1 https://github.com/tibetan-nlp/$D
|
4 |
+
done
|
5 |
+
( for F in *-tibetan-corpus/conllu/*.conllu
|
6 |
+
do case $F in
|
7 |
+
*-translated.conllu) : ;;
|
8 |
+
*) cat $F ;;
|
9 |
+
esac
|
10 |
+
done
|
11 |
+
) | sed 's/\tNOTAG\t/\tX\t/' > all.conllu
|
12 |
+
python3 -m esupar.train KoichiYasuoka/bert-base-tibetan KoichiYasuoka/bert-base-tibetan-upos 32 /tmp all.conllu
|
13 |
+
exit 0
|
pytorch_model.bin
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:084a4a08376e2e50060c5aa8792a0d6ebe903c2c5933c083628c3a25c868f700
|
3 |
+
size 434730022
|
special_tokens_map.json
ADDED
@@ -0,0 +1,37 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"cls_token": {
|
3 |
+
"content": "[CLS]",
|
4 |
+
"lstrip": false,
|
5 |
+
"normalized": false,
|
6 |
+
"rstrip": false,
|
7 |
+
"single_word": false
|
8 |
+
},
|
9 |
+
"mask_token": {
|
10 |
+
"content": "[MASK]",
|
11 |
+
"lstrip": false,
|
12 |
+
"normalized": false,
|
13 |
+
"rstrip": false,
|
14 |
+
"single_word": false
|
15 |
+
},
|
16 |
+
"pad_token": {
|
17 |
+
"content": "[PAD]",
|
18 |
+
"lstrip": false,
|
19 |
+
"normalized": false,
|
20 |
+
"rstrip": false,
|
21 |
+
"single_word": false
|
22 |
+
},
|
23 |
+
"sep_token": {
|
24 |
+
"content": "[SEP]",
|
25 |
+
"lstrip": false,
|
26 |
+
"normalized": false,
|
27 |
+
"rstrip": false,
|
28 |
+
"single_word": false
|
29 |
+
},
|
30 |
+
"unk_token": {
|
31 |
+
"content": "[UNK]",
|
32 |
+
"lstrip": false,
|
33 |
+
"normalized": false,
|
34 |
+
"rstrip": false,
|
35 |
+
"single_word": false
|
36 |
+
}
|
37 |
+
}
|
tokenizer_config.json
ADDED
@@ -0,0 +1,57 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"added_tokens_decoder": {
|
3 |
+
"0": {
|
4 |
+
"content": "[PAD]",
|
5 |
+
"lstrip": false,
|
6 |
+
"normalized": false,
|
7 |
+
"rstrip": false,
|
8 |
+
"single_word": false,
|
9 |
+
"special": true
|
10 |
+
},
|
11 |
+
"1": {
|
12 |
+
"content": "[UNK]",
|
13 |
+
"lstrip": false,
|
14 |
+
"normalized": false,
|
15 |
+
"rstrip": false,
|
16 |
+
"single_word": false,
|
17 |
+
"special": true
|
18 |
+
},
|
19 |
+
"2": {
|
20 |
+
"content": "[CLS]",
|
21 |
+
"lstrip": false,
|
22 |
+
"normalized": false,
|
23 |
+
"rstrip": false,
|
24 |
+
"single_word": false,
|
25 |
+
"special": true
|
26 |
+
},
|
27 |
+
"3": {
|
28 |
+
"content": "[SEP]",
|
29 |
+
"lstrip": false,
|
30 |
+
"normalized": false,
|
31 |
+
"rstrip": false,
|
32 |
+
"single_word": false,
|
33 |
+
"special": true
|
34 |
+
},
|
35 |
+
"4": {
|
36 |
+
"content": "[MASK]",
|
37 |
+
"lstrip": false,
|
38 |
+
"normalized": false,
|
39 |
+
"rstrip": false,
|
40 |
+
"single_word": false,
|
41 |
+
"special": true
|
42 |
+
}
|
43 |
+
},
|
44 |
+
"clean_up_tokenization_spaces": true,
|
45 |
+
"cls_token": "[CLS]",
|
46 |
+
"do_basic_tokenize": true,
|
47 |
+
"do_lower_case": false,
|
48 |
+
"mask_token": "[MASK]",
|
49 |
+
"model_max_length": 512,
|
50 |
+
"never_split": null,
|
51 |
+
"pad_token": "[PAD]",
|
52 |
+
"sep_token": "[SEP]",
|
53 |
+
"strip_accents": false,
|
54 |
+
"tokenize_chinese_chars": true,
|
55 |
+
"tokenizer_class": "BertTokenizer",
|
56 |
+
"unk_token": "[UNK]"
|
57 |
+
}
|
upos.py
ADDED
@@ -0,0 +1,41 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from transformers import TokenClassificationPipeline
|
2 |
+
|
3 |
+
class BellmanFordTokenClassificationPipeline(TokenClassificationPipeline):
|
4 |
+
def __init__(self,**kwargs):
|
5 |
+
import numpy
|
6 |
+
super().__init__(**kwargs)
|
7 |
+
x=self.model.config.label2id
|
8 |
+
y=[k for k in x if not k.startswith("I-")]
|
9 |
+
self.transition=numpy.full((len(x),len(x)),numpy.nan)
|
10 |
+
for k,v in x.items():
|
11 |
+
for j in ["I-"+k[2:]] if k.startswith("B-") else [k]+y if k.startswith("I-") else y:
|
12 |
+
self.transition[v,x[j]]=0
|
13 |
+
def check_model_type(self,supported_models):
|
14 |
+
pass
|
15 |
+
def postprocess(self,model_outputs,**kwargs):
|
16 |
+
import numpy
|
17 |
+
if "logits" not in model_outputs:
|
18 |
+
return self.postprocess(model_outputs[0],**kwargs)
|
19 |
+
m=model_outputs["logits"][0].numpy()
|
20 |
+
e=numpy.exp(m-numpy.max(m,axis=-1,keepdims=True))
|
21 |
+
z=e/e.sum(axis=-1,keepdims=True)
|
22 |
+
for i in range(m.shape[0]-1,0,-1):
|
23 |
+
m[i-1]+=numpy.nanmax(m[i]+self.transition,axis=1)
|
24 |
+
k=[numpy.nanargmax(m[0]+self.transition[0])]
|
25 |
+
for i in range(1,m.shape[0]):
|
26 |
+
k.append(numpy.nanargmax(m[i]+self.transition[k[-1]]))
|
27 |
+
w=[{"entity":self.model.config.id2label[j],"start":s,"end":e,"score":z[i,j]} for i,((s,e),j) in enumerate(zip(model_outputs["offset_mapping"][0].tolist(),k)) if s<e]
|
28 |
+
if "aggregation_strategy" in kwargs and kwargs["aggregation_strategy"]!="none":
|
29 |
+
for i,t in reversed(list(enumerate(w))):
|
30 |
+
p=t.pop("entity")
|
31 |
+
if p.startswith("I-"):
|
32 |
+
w[i-1]["score"]=min(w[i-1]["score"],t["score"])
|
33 |
+
w[i-1]["end"]=w.pop(i)["end"]
|
34 |
+
elif p.startswith("B-"):
|
35 |
+
t["entity_group"]=p[2:]
|
36 |
+
else:
|
37 |
+
t["entity_group"]=p
|
38 |
+
for t in w:
|
39 |
+
t["text"]=model_outputs["sentence"][t["start"]:t["end"]]
|
40 |
+
return w
|
41 |
+
|
vocab.txt
ADDED
The diff for this file is too large to render.
See raw diff
|
|