我一直在尝试在 nlp 任务中创建一个词汇文件,以在trax的标记化方法中使用来标记单词,但我找不到用于创建 *.subwords 文件的模块/库。请帮帮我?
问问题
146 次
2 回答
1
将 trax.data.Tokenize 与您自己的数据和子词词汇表一起使用的最简单方法是使用Google 的 Sentencepiece python 模块
import sentencepiece as spm
spm.SentencePieceTrainer.train('--input=data/my_data.csv --model_type=bpe --model_prefix=my_model --vocab_size=32000')
这将创建两个文件:
- my_model.model
- my_model.vocab
我们将在 trax.data.Tokenize 中使用这个模型,我们将添加参数 vocab_type 的值为“sentencepiece”
trax.data.Tokenize(vocab_dir='vocab/', vocab_file='my_model.model', vocab_type='sentencepiece')
我认为这是最好的方法,因为您可以加载模型并使用它来获取控制 ID,同时避免硬编码
sp = spm.SentencePieceProcessor()
sp.load('my_model.model')
print('bos=sp.bos_id()=', sp.bos_id())
print('eos=sp.eos_id()=', sp.eos_id())
print('unk=sp.unk_id()=', sp.unk_id())
print('pad=sp.pad_id()=', sp.pad_id())
sentence = "hello world"
# encode: text => id
print("Pieces: ", sp.encode_as_pieces(sentence))
print("Ids: ", sp.encode_as_ids(sentence))
# decode: id => text
print("Decode Pieces: ", sp.decode_pieces(sp.encode_as_pieces(sentence)))
print("Decode ids: ", sp.decode_ids(sp.encode_as_ids(sentence)))
print([sp.bos_id()] + sp.encode_as_ids(sentence) + [sp.eos_id()])
如果你仍然想要一个子词文件,试试这个:
python trax/data/text_encoder_build_subword.py \
--corpus_filepattern=data/data.txt --corpus_max_lines=40000 \
--output_filename=data/my_file.subword
我希望这会有所帮助,因为没有明确的文献可以了解如何创建兼容的子词文件
于 2021-08-26T10:48:29.913 回答
0
您可以使用 tensorflow API SubwordTextEncoder
使用以下代码片段 -
encoder = tfds.deprecated.text.SubwordTextEncoder.build_from_corpus(
(text_row for text_row in text_dataset), target_vocab_size=2**15)
encoder.save_to_file(vocab_fname)
Tensorflow 会将 .subwords 扩展名附加到上述词汇文件中。
于 2020-12-30T11:04:28.490 回答