bert-base-japanese-wikipedia-ud-head

KoichiYasuoka
Pregunta y respuesta

Este es un modelo BERT preentrenado en textos de Wikipedia en japonés para el análisis de dependencias (detección de cabeza en palabras de unidad larga) como cuestionario-respuesta, derivado de bert-base-japanese-char-extended y UD_Japanese-GSDLUW. Use [MASK] dentro del contexto para evitar ambigüedades al especificar una palabra de uso múltiple como pregunta.

Como usar

from transformers import AutoTokenizer, AutoModelForQuestionAnswering, QuestionAnsweringPipeline
tokenizer = AutoTokenizer.from_pretrained('KoichiYasuoka/bert-base-japanese-wikipedia-ud-head')
model = AutoModelForQuestionAnswering.from_pretrained('KoichiYasuoka/bert-base-japanese-wikipedia-ud-head')
qap = QuestionAnsweringPipeline(tokenizer=tokenizer, model=model, align_to_words=False)
print(qap(question='国語', context='全学年にわたって小学校の国語の教科書に挿し絵が用いられている'))
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/bert-base-japanese-wikipedia-ud-head')
print(nlp('全学年にわたって小学校の国語の教科書に挿し絵が用いられている'))

Funcionalidades

Preentrenado en textos de Wikipedia en japonés
Análisis de dependencias
Detección de cabeza en palabras de unidad larga
Derivado de bert-base-japanese-char-extended y UD_Japanese-GSDLUW

Casos de uso

Respuesta a preguntas
Análisis de dependencias en japonés
Detección de cabeza en palabras de unidad larga