基于transformor的拼音转汉字语言模型。

该工程可以训练和测试transformor为基础搭建拼音转汉字的模型。
功能类似于拼音输入法,如:输入:jin1 tian1 tian1 qi4 ru2 he2 得到:今天天气如何。
请下载工程:
https://download.csdn.net/download/qq_41854731/13089067 .

Prepare

data/text_lm.txt # 拼音+汉字

格式:
yi3 hou4 ni3 shi4 nan2 hai2 zi 以后你是男孩子
lan2 zhou1 na3 you3 mai3 lu4 hu3 qi4 che1 de 兰州哪有买路虎汽车的
kan4 kan4 wo3 de ri4 cheng2 biao3 看看我的日程表
wo3 lao3 po2 shi4 da4 ben4 dan4 我老婆是大笨蛋
wo3 shuo1 ni3 ming2 tian1 zao3 shang4 qi1 dian3 jiao4 wo3 qi3 chuang2 我说你明天早上七点叫我起床
zai4 gei3 wo3 jiang3 ge4 xiao4 hua4 hao3 ma 再给我讲个笑话好吗
bo1 fang4 ge1 qu1 zui4 xuan4 min2 zu2 feng1 播放歌曲最炫民族风
tui4 chu1 dang1 qian2 bo1 fang4 mo2 shi4 退出当前播放模式

Train

python train_lm.py -c config/conf_lm.yaml

代码如下:
下面展示一些 内联代码片

import os
import tensorflow as tf
import keras
import time
import yaml  # pin install pyyaml
import argparse
from utils_lm import get_data, data_hparams
from transformer import Lm, lm_hparams
parser = argparse.ArgumentParser()
parser.add_argument(
    '-c', '--config', type=str, default='config/conf_lm.yaml')
parser.add_argument(
    '-s', '--save_path', type=str, default="save_models/"+time.strftime("%m-%d-%H-%M-%S")+"-logs")
cmd_args = parser.parse_args()
# 自动分配GPU内存,以防止Gpu内存不够的情况
config = tf.ConfigProto()
config.gpu_options.allow_growth = True
keras.backend.tensorflow_backend.set_session(tf.Session(config=config))
def dic2args(dic):
    将dict转换成args的格式。
    params = tf.contrib.training.HParams()
    for keys in dic:
        params.add_hparam(keys, dic[keys])
    return params
# 加载整个训练必要的config
f = open(cmd_args.config, 'r', encoding='utf-8')
parms_dict = yaml.load(f, Loader=yaml.FullLoader)
f.close()
# 训练数据参数
data_args = dic2args(parms_dict['data'])
train_data = get_data(data_args)
batch_num = train_data.batch_num
# 语言模型参数
parms_dict['model']['input_vocab_size'] = len(train_data.pny_vocab)
parms_dict['model']['label_vocab_size'] = len(train_data.han_vocab)
lm_args = dic2args(parms_dict['model'])
lm = Lm(lm_args)
# 训练的参数
epochs = parms_dict['train']['epochs']
save_path = parms_dict['train']['save_path'] = cmd_args.save_path
retrain_dir = parms_dict['train']['retrain_dir']
tensorboard_dir = os.path.join(save_path,"tensorboard")
## 保存pny_vocab、han_bocab、config.yaml、train_log.txt
config_path = os.path.join(save_path,'config')
os.makedirs(config_path,exist_ok=True)
pny_vocab = train_data.pny_vocab
han_vocab = train_data.han_vocab
## 保存pinyinvocab
pny_vocab_file = os.path.join(config_path,"pny_vocab.txt")
f = open(pny_vocab_file,"w",encoding='utf-8')
f.write("\n".join(pny_vocab))
f.close()
## 保存汉字vocab
han_vocab_file = os.path.join(config_path,"han_vocab.txt")
f = open(han_vocab_file,"w",encoding='utf-8')
f.write("\n".join(han_vocab))
f.close()
## 保存config
parms_dict['data']['pny_vocab_file'] = pny_vocab_file
parms_dict['data']['han_vocab_file'] = han_vocab_file
f = open(os.path.join(config_path,"config.yaml"),"w",encoding='utf-8')
yaml.dump(parms_dict,f)
f.close()
## 保存训练log
f = open(os.path.join(config_path,"train_log.txt"),"w")
## 生成saver对象以可以使用 saver.save(sess, checkpointname)生成checkpoint
with lm.graph.as_default():  # tf.Graph().as_default()as_default()
    saver = tf.train.Saver()
with tf.Session(graph=lm.graph) as sess:
    merged = tf.summary.merge_all()
    sess.run(tf.global_variables_initializer())
    if retrain_dir:
        # 加载已训练模型
        print('loading language model...')
        latest = tf.train.latest_checkpoint(retrain_dir)
        saver.restore(sess, latest)
    writer = tf.summary.FileWriter(tensorboard_dir, tf.get_default_graph())
    for k in range(epochs):
        # 开始训练
        total_loss = 0
        steps_loss = 0
        batch = train_data.get_lm_batch()
        for i in range(batch_num):
            input_batch, label_batch = next(batch)
            feed = {lm.x: input_batch, lm.y: label_batch}
            cost, _ = sess.run([lm.mean_loss, lm.train_op], feed_dict=feed)
            total_loss += cost
            # 显示loss信息
            step = k * batch_num + i
            if step % 100 == 0:
                # 用于tensorboard的loss显示。
                rs = sess.run(merged, feed_dict=feed)
                writer.add_summary(rs, step)
                # 打印训练过程中的loss
                current = time.strftime("%m-%d-%H-%M-%S")
                avg_loss = (total_loss - steps_loss) / 100
                print_s = "[%s INFO] -Training-Epoch-%02d(%.3f), Global Step:%07d, Loss:%.5f, Avgloss:%.5f" %(current, k, i/batch_num, step, cost, avg_loss)
                print(print_s)
                f.write(print_s+"\n")
                steps_loss = total_loss
        # 打印一个epoch的平均loss
        print_s = 'epochs'+str(k+1)+': average loss = '+str(total_loss/batch_num)+"\n"
        print(print_s)
        f.write(print_s)
        # 保存成checkpoint模型
        # if k % 10 == 0:
        saver.save(sess, os.path.join(save_path, 'model_%d' % k))
    saver.save(sess, os.path.join(save_path, 'model_%d' % epochs))
    writer.close()

注意修改config文件。

python test_lm.py -c save_models/11-03-01-49-09-logs/config/config.yaml
代码如下:

#coding=utf-8
import os
import difflib
import tensorflow as tf
import numpy as np
from utils_lm import decode_ctc, GetEditDistance
from transformer import Lm, lm_hparams
import yaml  # pin install pyyaml
import argparse
import numpy as np
import keras
def dic2args(dic):
    将dict转换成args的格式。
    params = tf.contrib.training.HParams()
    for keys in dic:
        params.add_hparam(keys, dic[keys])
    return params
parser = argparse.ArgumentParser()
parser.add_argument(
    '-c', '--config', type=str, default='save_models/11-03-01-49-09-logs/config/config.yaml')
cmd_args = parser.parse_args()
# 自动分配GPU内存,以防止Gpu内存不够的情况
config = tf.ConfigProto()
config.gpu_options.allow_growth = True
keras.backend.tensorflow_backend.set_session(tf.Session(config=config))
# 加载整个训练必要的config
f = open(cmd_args.config, 'r', encoding='utf-8')
parms_dict = yaml.load(f, Loader=yaml.FullLoader)
f.close()
lm_args = dic2args(parms_dict['model'])
lm_args.add_hparam('save_path',parms_dict['train']['save_path'])
lm_args.dropout_rate = 0.
### 加载语言模型
print('loading language model...')
lm = Lm(lm_args)
sess = tf.Session(graph=lm.graph)
with lm.graph.as_default():
    saver =tf.train.Saver()
with sess.as_default():
    latest = tf.train.latest_checkpoint(lm_args.save_path)
    saver.restore(sess, latest)
## 加载汉字vocab和pinyin vocab。
han_vocab = np.loadtxt(os.path.join(lm_args.save_path,'config','han_vocab.txt'),dtype=str,delimiter="\n")
pny_vocab = np.loadtxt(os.path.join(lm_args.save_path,'config','pny_vocab.txt'),dtype=str,delimiter="\n").tolist()
with sess.as_default():
    # 输入拼音
    text_ = "jin1 tian1 tian1 qi4 ru2 he2"
    # real = ""
    text = text_.strip('\n').split(' ')
    x = np.array([pny_vocab.index(pny) for pny in text])
    x = x.reshape(1, -1)
    preds = sess.run(lm.preds, {lm.x: x})
    got = ''.join(han_vocab[idx] for idx in preds[0])
    # 打印预测结果
    print(text_," --> ",got)
sess.close()

在save_models中保存了一个已经训练好的模型。运行text_lm.py时,打印结果为:jin1 tian1 tian1 qi4 ru2 he2 --> 今天天气如何

https://github.com/audier/DeepSpeechRecognition

基于transformor的拼音转汉字语言模型。简介该工程可以训练和测试transformor为基础搭建拼音转汉字的模型。功能类似于拼音输入法,如:输入:jin1 tian1 tian1 qi4 ru2 he2 得到:今天天气如何。请下载工程:Preparedata/text_lm.txt # 拼音+汉字格式:yi3 hou4 ni3 shi4 nan2 hai2 zi 以后你是男孩子lan2 zhou1 na3 you3 mai3 lu4 hu3 qi4 che1 de 兰州哪有买路虎
【NLP】Transformer架构解析1. 认识Transformer架构1.1 Transformer模型的作用1.2 Transformer总体架构图2. 输入部分实现2.1 文本嵌入层的作用2.2 位置编码器的作用 1. 认识Transformer架构 1.1 Transformer模型的作用 基于seq2seq架构的transformer模型可以完成NLP领域研究的典型任务, 如机器翻译, 文本生成等. 同时又可以构建预训练语言模型,用于不同任务的迁移学习. 在接下来的架构分析中, 我
前两篇文章分别介绍了利用中文拼音库生成基于Trie树的音节模型和将输入的字符串进行音节拆分,本篇文章主要介绍如何利用中文语料构建拼音语料模型拼音换中文. 二.构建拼音语料模型 先来看看拼音中文效果,输入字符串"zhuanye", 打印print(Pinyin2Chinese().covert(‘zhuanye’)) 思路:获取中文语料(来源可以从数据库或者静态文件,包括excel表和.txt表),然后将语料结巴进行分词,然后利用pypinyin工具将分词换成拼音,用列表存储,最后写出二进
1.背景介绍 语音识别和语音生成是人工智能领域的两个重要研究方向,它们在现实生活中的应用也非常广泛。语音识别技术可以将语音信号换为文本,从而实现人机交互、语音助手等功能;而语音生成技术则可以将文本换为语音,实现文字到语音的换,从而提供语音新闻、导航等服务。 在过去的几年里,深度学习技术呈现了快速发展的趋势,尤其是自然语言处理(NLP)领域的成果,如机器翻译、情感分析等,都取得了显著的进展...