日本分词器的 HuggingFace
HuggingFace for Japanese tokenizer
我最近根据源代码测试了以下代码:
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)
有没有人以前遇到过这种情况?我尝试了很多不同的方法并参考了很多帖子,但都使用相同的方法并且没有解释,我只是想测试多种语言,其他语言似乎可以正常工作但日语不行,我不知道为什么。
快速检查了一下,我没有错误,也许你的情况存在一些版本问题?
从外观上看,错误发生在 BertJapaneseTokenizer 上,因此可能是您拥有的分词器版本(mecab?)与您的环境不兼容。
我环境中的mecab-python:
!pip list | grep mecab
#mecab-python3 0.996.5
也许您可以创建一个新环境或尝试以下(或其他一些可用版本):
!pip install 'mecab-python3==0.996.5' --force-reinstall
编辑:修复了环境设置(感谢 @polm23)
注意:在这个问题出现后不久,我发布了一个适用于最新版本 mecab-python3 的 IPADic 版本。您应该能够通过安装 transformers[ja]
来解决问题,这将安装用于 HuggingFace 模型的主要词典。
我是 mecab-python3 的维护者。 Transformers 在 1.0 之前的版本中依赖于捆绑的字典,该字典已被删除,因为它太旧了。我将很快将它作为一个选项添加到一个版本中,但与此同时你可以安装一个旧版本。
vivasra 发布的命令不起作用,因为它指定了不存在的不同包的版本(请注意包名称中没有“3”)。你可以使用这个:
pip install mecab-python3=0.996.5
如果您仍然遇到问题,请打开一个问题 on Github。
我最近根据源代码测试了以下代码: 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)
有没有人以前遇到过这种情况?我尝试了很多不同的方法并参考了很多帖子,但都使用相同的方法并且没有解释,我只是想测试多种语言,其他语言似乎可以正常工作但日语不行,我不知道为什么。
快速检查了一下,我没有错误,也许你的情况存在一些版本问题?
从外观上看,错误发生在 BertJapaneseTokenizer 上,因此可能是您拥有的分词器版本(mecab?)与您的环境不兼容。
我环境中的mecab-python:
!pip list | grep mecab
#mecab-python3 0.996.5
也许您可以创建一个新环境或尝试以下(或其他一些可用版本):
!pip install 'mecab-python3==0.996.5' --force-reinstall
编辑:修复了环境设置(感谢 @polm23)
注意:在这个问题出现后不久,我发布了一个适用于最新版本 mecab-python3 的 IPADic 版本。您应该能够通过安装 transformers[ja]
来解决问题,这将安装用于 HuggingFace 模型的主要词典。
我是 mecab-python3 的维护者。 Transformers 在 1.0 之前的版本中依赖于捆绑的字典,该字典已被删除,因为它太旧了。我将很快将它作为一个选项添加到一个版本中,但与此同时你可以安装一个旧版本。
vivasra 发布的命令不起作用,因为它指定了不存在的不同包的版本(请注意包名称中没有“3”)。你可以使用这个:
pip install mecab-python3=0.996.5
如果您仍然遇到问题,请打开一个问题 on Github。