deberta-base-thai-ud-head

KoichiYasuoka
Pregunta y respuesta

Este es un modelo DeBERTa(V2) preentrenado con textos de Wikipedia en tailandés para el análisis de dependencias (detección de cabecera en Dependencias Universales) como respuesta a preguntas, derivado de deberta-base-thai. Utiliza [MASK] dentro del contexto para evitar ambigüedad al especificar una palabra de uso múltiple como pregunta.

Como usar

from transformers import AutoTokenizer,AutoModelForQuestionAnswering,QuestionAnsweringPipeline
tokenizer=AutoTokenizer.from_pretrained("KoichiYasuoka/deberta-base-thai-ud-head")
model=AutoModelForQuestionAnswering.from_pretrained("KoichiYasuoka/deberta-base-thai-ud-head")
qap=QuestionAnsweringPipeline(tokenizer=tokenizer,model=model,align_to_words=False)
print(qap(question="กว่า",context="หลายหัวดีกว่าหัวเดียว"))

or (with ufal.chu-liu-edmonds)

class TransformersUD(object):
    def __init__(self, bert):
        import os
        from transformers import (AutoTokenizer, AutoModelForQuestionAnswering, AutoModelForTokenClassification, AutoConfig, TokenClassificationPipeline)
        self.tokenizer = AutoTokenizer.from_pretrained(bert)
        self.model = AutoModelForQuestionAnswering.from_pretrained(bert)
        x = AutoModelForTokenClassification.from_pretrained
        if os.path.isdir(bert):
            d,t = x(os.path.join(bert, "deprel")), x(os.path.join(bert, "tagger"))
        else:
            from transformers.utils import cached_file
            c = AutoConfig.from_pretrained(cached_file(bert,"deprel/config.json"))
            d = x(cached_file(bert,"deprel/pytorch_model.bin"), config=c)
            s = AutoConfig.from_pretrained(cached_file(bert,"tagger/config.json"))
            t = x(cached_file(bert,"tagger/pytorch_model.bin"), config=s)
        self.deprel = TokenClassificationPipeline(model=d, tokenizer=self.tokenizer, aggregation_strategy="simple")
        self.tagger = TokenClassificationPipeline(model=t, tokenizer=self.tokenizer)
    def __call__(self, text):
        import numpy, torch, ufal.chu_liu_edmonds
        w = [(t["start"], t["end"], t["entity_group"]) for t in self.deprel(text)]
        z, n = {t["start"]: t["entity"].split("|") for t in self.tagger(text)}, len(w)
        r, m = [text[s:e] for s, e, p in w], numpy.full((n+1, n+1), numpy.nan)
        v, c = self.tokenizer(r, add_special_tokens=False)["input_ids"], []
        for i, t in enumerate(v):
            q = [self.tokenizer.cls_token_id]+t+[self.tokenizer.sep_token_id]
            c.append([q]+v[0:i]+[[self.tokenizer.mask_token_id]]+v[i+1:]+[[q[-1]]])
        b = [[len(sum(x[0:j+1], [])) for j in range(len(x))] for x in c]
        with torch.no_grad():
            d = self.model(input_ids=torch.tensor([sum(x, []) for x in c]), token_type_ids=torch.tensor([[0]*x[0]+[1]*(x[-1]-x[0]) for x in b]))
            s, e = d.start_logits.tolist(), d.end_logits.tolist()
        for i in range(n):
            for j in range(n):
                m[i+1,0 if i==j else j+1] = s[i][b[i][j]] + e[i][b[i][j+1]-1]
        h = ufal.chu_liu_edmonds.chu_liu_edmonds(m)[0]
        if [0 for i in h if i==0] != [0]:
            i = ([p for s, e, p in w] + ["root"]).index("root")
            j = i+1 if i else numpy.nanargmax(m[:,0])
            m[0:j,0] = m[j+1:,0] = numpy.nan
            h = ufal.chu_liu_edmonds.chu_liu_edmonds(m)[0]
        u = "# text = " + text.replace("\n", " ") + "\n"
        for i, (s, e, p) in enumerate(w, 1):
            p = "root" if h[i]==0 else "dep" if p=="root" else p
            u += "\t".join([str(i), r[i-1], "_", z[s][0][2:], "_", "|".join(z[s][1:]), str(h[i]), p, "_", "_" if i and e 0] else "SpaceAfter=No"]) + "\n"
        return u + "\n"

nlp = TransformersUD("KoichiYasuoka/deberta-base-thai-ud-head")
print(nlp("หลายหัวดีกว่าหัวเดียว"))

Funcionalidades

Preentrenado en textos de Wikipedia en tailandés
Análisis de dependencias
Detección de cabecera en Dependencias Universales
Respuesta a preguntas

Casos de uso

Respuesta a preguntas
Paráfrasis
Procesamiento del lenguaje natural en tailandés
Analisis de dependencias