Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 我可以使用标记化输入文件和高棉语的自定义词汇文件从头开始预先训练BERT模型吗_Python_Nlp_Tokenize_Bert Language Model - Fatal编程技术网

Python 我可以使用标记化输入文件和高棉语的自定义词汇文件从头开始预先训练BERT模型吗

Python 我可以使用标记化输入文件和高棉语的自定义词汇文件从头开始预先训练BERT模型吗,python,nlp,tokenize,bert-language-model,Python,Nlp,Tokenize,Bert Language Model,我想知道我是否可以使用自己的标记化/分段文档(以及自己的vocab文件)作为create\u pretraining\u data.py脚本的输入文件(git源代码:) 这个问题的主要原因是,高棉语的切分/标记化与英语不同 Original: វា​មាន​មក​ជាមួយ​នូវ Segmented/Tokenized: វា មាន មក ជាមួយ នូវ 在运行create\u pretraining\u data.py和run\u pretraining.py脚本后,我自己尝试了一

我想知道我是否可以使用自己的标记化/分段文档(以及自己的vocab文件)作为
create\u pretraining\u data.py
脚本的输入文件(git源代码:)

这个问题的主要原因是,高棉语的切分/标记化与英语不同

Original:
វា​មាន​មក​ជាមួយ​នូវ

Segmented/Tokenized:
វា មាន មក ជាមួយ នូវ
在运行
create\u pretraining\u data.py
run\u pretraining.py
脚本后,我自己尝试了一些方法,并获得了一些结果。然而,我不确定我所做的是否被认为是正确的

我还想知道我应该用什么方法来验证我的模型

非常感谢您的帮助

脚本修改 我所做的修改是:

1.以列表格式生成输入文件 我的输入文件不是普通的纯文本,而是来自我的自定义高棉语标记化输出,然后我将其转换为列表格式,模拟运行示例英语文本时得到的输出

[[['ដំណាំ', 'សាវម៉ាវ', 'ជា', 'ប្រភេទ', 'ឈើ', 'ហូប', 'ផ្លែ'],  
['វា', 'ផ្តល់', 'ផប្រយោជន៍', 'យ៉ាង', 'ច្រើន', 'ដល់', 'សុខភាព']],  
[['cmt', '$', '270', 'នាំ', 'លាភ', 'នាំ', 'សំណាង', 'ហេង', 'ហេង']]]
*外括号表示源文件,第一个嵌套括号表示文档,第二个嵌套括号表示句子。与
create\u training\u instances()
函数中的变量
all\u documents
的结构完全相同

2.从唯一的分词中提取Vocab文件 这是我真的有一些严重怀疑的部分。为了创建vocab文件,我所做的只是从整个文档中找到唯一的标记。然后我添加了核心令牌需求
[CLS]、[SEP]、[UNK]和[MASK]
。我不确定这样做是否正确

对此部分的反馈非常感谢

3.跳过create_training_instances()函数中的标记化步骤 由于我的输入文件已经与变量
all_documents
匹配,因此我将第183行跳到第207行。我将其替换为按原样读取输入:

  for input_file in input_files:
      with tf.gfile.GFile(input_file, "r") as reader:
          lines = reader.read()
      all_documents = ast.literal_eval(lines)
成果/产出 原始输入文件(在自定义标记化之前)来自随机web抓取

有关原始和vocab文件的一些信息:

Number of documents/articles: 5
Number of sentences: 78
Number of vocabs: 649 (including [CLS], [SEP] etc.)
下面是运行
create\u pretraining\u data.py

这就是我在运行
run\u pretraining.py


如上图所示,我从中得到的准确度非常低,因此我担心我是否做得正确。

首先,您似乎只有很少的培训数据(您提到的词汇量为649)。BERT是一个庞大的模型,需要大量的训练数据。谷歌发布的英文模型至少在整个维基百科上接受过培训。想想看

BERT使用了一种叫做WordPiece的东西来保证固定的词汇量。很少有词是这样分开的:
喷气式飞机制造商因座位宽度而不和,大订单处于危险之中
翻译为:
喷气式飞机制造商因座位宽度而不和,大订单处于危险之中

WordPieceTokenizer.tokenize(text)
接受一个由空格预处理的文本,因此您应该更改BasicTokenizer,它由您指定的标记器在WordPieceTokenizer之前运行,该标记器应该用空格分隔您的标记。 要训练您自己的WorPiece Tookenizer,请看一看,它在bpe模式下与WordPiece基本相同。 然后,您可以从您的字块模型导出词汇表

我自己并没有预先训练一个伯特模型,所以我无法帮助您准确地更改代码中的某些内容