HuggingFace для японского токенизатора - PullRequest
2 голосов
/ 12 июля 2020

Недавно я тестировал приведенный ниже код на основе источника: https://github.com/cl-tohoku/bert-japanese/blob/master/masked_lm_example.ipynb

import torch 
from transformers.tokenization_bert_japanese import BertJapaneseTokenizer
from transformers.modeling_bert import BertForMaskedLM

tokenizer = BertJapaneseTokenizer.from_pretrained('cl-tohoku/bert-base-japanese-whole-word-masking')
model = BertForMaskedLM.from_pretrained('cl-tohoku/bert-base-japanese-whole-word-masking')

input_ids = tokenizer.encode(f'''
    青葉山で{tokenizer.mask_token}の研究をしています。
''', return_tensors='pt')

при попытке его кодирования я получил ошибку, например:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-29-f8582275f4db> in <module>
      1 input_ids = tokenizer.encode(f'''
      2     青葉山で{tokenizer.mask_token}の研究をしています。
----> 3 ''', return_tensors='pt')

~/.pyenv/versions/3.7.0/envs/personal/lib/python3.7/site-packages/transformers/tokenization_utils_base.py in encode(self, text, text_pair, add_special_tokens, padding, truncation, max_length, stride, return_tensors, **kwargs)
   1428             stride=stride,
   1429             return_tensors=return_tensors,
-> 1430             **kwargs,
   1431         )
   1432 

~/.pyenv/versions/3.7.0/envs/personal/lib/python3.7/site-packages/transformers/tokenization_utils_base.py in encode_plus(self, text, text_pair, add_special_tokens, padding, truncation, max_length, stride, is_pretokenized, pad_to_multiple_of, return_tensors, return_token_type_ids, return_attention_mask, return_overflowing_tokens, return_special_tokens_mask, return_offsets_mapping, return_length, verbose, **kwargs)
   1740             return_length=return_length,
   1741             verbose=verbose,
-> 1742             **kwargs,
   1743         )
   1744 

~/.pyenv/versions/3.7.0/envs/personal/lib/python3.7/site-packages/transformers/tokenization_utils.py in _encode_plus(self, text, text_pair, add_special_tokens, padding_strategy, truncation_strategy, max_length, stride, is_pretokenized, pad_to_multiple_of, return_tensors, return_token_type_ids, return_attention_mask, return_overflowing_tokens, return_special_tokens_mask, return_offsets_mapping, return_length, verbose, **kwargs)
    452             )
    453 
--> 454         first_ids = get_input_ids(text)
    455         second_ids = get_input_ids(text_pair) if text_pair is not None else None
    456 

~/.pyenv/versions/3.7.0/envs/personal/lib/python3.7/site-packages/transformers/tokenization_utils.py in get_input_ids(text)
    423         def get_input_ids(text):
    424             if isinstance(text, str):
--> 425                 tokens = self.tokenize(text, **kwargs)
    426                 return self.convert_tokens_to_ids(tokens)
    427             elif isinstance(text, (list, tuple)) and len(text) > 0 and isinstance(text[0], str):

~/.pyenv/versions/3.7.0/envs/personal/lib/python3.7/site-packages/transformers/tokenization_utils.py in tokenize(self, text, **kwargs)
    362 
    363         no_split_token = self.unique_no_split_tokens
--> 364         tokenized_text = split_on_tokens(no_split_token, text)
    365         return tokenized_text
    366 

~/.pyenv/versions/3.7.0/envs/personal/lib/python3.7/site-packages/transformers/tokenization_utils.py in split_on_tokens(tok_list, text)
    356                     (
    357                         self._tokenize(token) if token not in self.unique_no_split_tokens else [token]
--> 358                         for token in tokenized_text
    359                     )
    360                 )

~/.pyenv/versions/3.7.0/envs/personal/lib/python3.7/site-packages/transformers/tokenization_utils.py in <genexpr>(.0)
    356                     (
    357                         self._tokenize(token) if token not in self.unique_no_split_tokens else [token]
--> 358                         for token in tokenized_text
    359                     )
    360                 )

~/.pyenv/versions/3.7.0/envs/personal/lib/python3.7/site-packages/transformers/tokenization_bert_japanese.py in _tokenize(self, text)
    153     def _tokenize(self, text):
    154         if self.do_word_tokenize:
--> 155             tokens = self.word_tokenizer.tokenize(text, never_split=self.all_special_tokens)
    156         else:
    157             tokens = [text]

~/.pyenv/versions/3.7.0/envs/personal/lib/python3.7/site-packages/transformers/tokenization_bert_japanese.py in tokenize(self, text, never_split, **kwargs)
    205                 break
    206 
--> 207             token, _ = line.split("\t")
    208             token_start = text.index(token, cursor)
    209             token_end = token_start + len(token)

ValueError: too many values to unpack (expected 2)

У кого-нибудь такое было раньше? Я пробовал много разных способов и ссылался на множество сообщений, но все использовал одни и те же методы и никаких объяснений, я просто хотел протестировать несколько языков, другие языки, похоже, работают нормально, но не с японским, и я не знаю почему.

Ответы [ 2 ]

2 голосов
/ 15 июля 2020

Я сопровождаю mecab- python3. В версиях до 1.0 Transformers полагаются на встроенный словарь, который был удален, потому что он старый. Я скоро добавлю его в качестве опции в выпуске, но пока вы можете установить старую версию.

Команда, отправленная vivasra, не работает, потому что она указывает версию другого пакета (примечание в названии пакета нет "3"), которого не существует. Вы можете использовать это:

pip install mecab-python3=0.996.5

Если у вас все еще есть проблемы, пожалуйста, откройте проблему на Github .

0 голосов
/ 13 июля 2020

При быстрой проверке у меня нет ошибок, может быть, в вашем случае есть проблемы с версией?

Судя по тому, как это выглядит, ошибка возникает с BertJapaneseTokenizer, поэтому, возможно, версия токенизатора ( mecab?), который у вас есть, несовместим с вашей средой.

Mecab- python в моей среде:

!pip list | grep mecab
#mecab-python3  0.996.5

Может быть, вы могли бы создать новую среду или попробовать следующее (или какая-то другая доступная версия):

!pip install 'mecab-python3==0.996.5' --force-reinstall

Edit: исправлена ​​настройка среды (спасибо, @ polm23)

...