主要生成相似句 再用神经网络判定句子的通顺性

直接上代码

两部分工作:

第一部分基于统计生成相似语料:

借助网上的python的github上的synonyms(自行百度):https://github.com/huyingxi/Synonyms   这里要说一下 分词不要用         垃圾 的jieba 可以考虑hanlp 或者其他的 ;

效果如下:

例如 ”查看公司财务“

生成的句子:

查看公司的财务
        查看公司的财政
        查看公司的财务状况
       查看公司的公司财务
      查看公司的税务
      查看公司的负债
     查看公司的财务管理
    查看公司的帐目
    查看公司的人力资源
    查看公司的人事管理
     查看该公司的财务
       查看该公司的财政
         查看该公司的财务状况
         查看该公司的公司财务
             查看该公司的税务
             查看该公司的负债
               查看该公司的财务管理
                 查看该公司的帐目
                 查看该公司的人力资源
                    查看该公司的人事管理
                        查看的公司的财务
                        查看的公司的财政
                         查看的公司的财务状况

自己思路: 中文语料库进行分词,然后进行获取同义词替换,这里可以考虑n-gram   n=1,2,3  做

Bi-Gram:  P(T)=p(w1|begin)*p(w2|w1)*p(w3|w2)***p(wn|wn-1)

Tri-Gram:  P(T)=p(w1|begin1,begin2)*p(w2|w1,begin1)*p(w3|w2w1)***p(wn|wn-1,wn-2)

里面的概率用统计词频来处理求解  具体求解可以参考:https://blog.csdn.net/weixin_37767223/article/details/83187802

最后根据概率大小判定句子是不是通顺, 这个 我这里就没做 感兴趣的可以做一下 比较简单

第二部分神经网络模型判定句子通顺性:

例如:我的顺心很不工作      分数: 11.457166507915696

我的工作很不顺心    分数: 37.69209207976687

后面优化如下:

由于数据量大(500w)后面做一些改进

1. softmax 进行优化 主要把softmax   改写成  hierarchical softmax

2.主要把句子通顺性的对比进行阈值的确定

网络模型代码:

def main():parser = argparse.ArgumentParser()parser.add_argument('--data_dir', type=str, default='data/',help='data directory containing input.txt')parser.add_argument('--batch_size', type=int, default=120,help='minibatch size')parser.add_argument('--win_size', type=int, default=20,help='context sequence length')parser.add_argument('--hidden_num', type=int, default=64,help='number of hidden layers')parser.add_argument('--word_dim', type=int, default=50,help='number of word embedding')parser.add_argument('--num_epochs', type=int, default=10,help='number of epochs')parser.add_argument('--grad_clip', type=float, default=10.,help='clip gradients at this value')args = parser.parse_args()data_loader = TextLoader(args.data_dir, args.batch_size, args.win_size)args.vocab_size = data_loader.vocab_sizegraph = tf.Graph()with graph.as_default():input_data = tf.placeholder(tf.int64, [args.batch_size, args.win_size])targets = tf.placeholder(tf.int64, [args.batch_size, 1])with tf.variable_scope('nnlm' + 'embedding'):embeddings = tf.Variable(tf.random_uniform([args.vocab_size, args.word_dim], -1.0, 1.0))embeddings = tf.nn.l2_normalize(embeddings, 1) #范化的 按行还是按列进行范化with tf.variable_scope('nnlm' + 'weight'):weight_h = tf.Variable(tf.truncated_normal([args.win_size * args.word_dim, args.hidden_num],stddev=1.0 / math.sqrt(args.hidden_num)))softmax_w = tf.Variable(tf.truncated_normal([args.win_size * args.word_dim, args.vocab_size],stddev=1.0 / math.sqrt(args.win_size * args.word_dim)))softmax_u = tf.Variable(tf.truncated_normal([args.hidden_num, args.vocab_size],stddev=1.0 / math.sqrt(args.hidden_num)))b_1 = tf.Variable(tf.random_normal([args.hidden_num]))b_2 = tf.Variable(tf.random_normal([args.vocab_size]))def infer_output(input_data):# """# hidden = tanh(x * H + b_1)# output = softmax(x * W + hidden * U + b_2)# """input_data_emb = tf.nn.embedding_lookup(embeddings,input_data) #选取一个张量里面索引对应的元素input_data_emb = tf.reshape(input_data_emb, [-1, args.win_size * args.word_dim]) #行数不变 宽度改变hidden = tf.tanh(tf.matmul(input_data_emb, weight_h)) + b_1hidden_output = tf.matmul(hidden, softmax_u) + tf.matmul(input_data_emb, softmax_w) + b_2output = tf.nn.softmax(hidden_output)return outputoutputs = infer_output(input_data) #input_data 数据格式one_hot_targets = tf.one_hot(tf.squeeze(targets), args.vocab_size, 1.0, 0.0) #把这个映射成one_hot形式loss = -tf.reduce_mean(tf.reduce_sum(tf.log(outputs) * one_hot_targets, 1))# Clip grad.optimizer = tf.train.AdagradOptimizer(0.1)gvs = optimizer.compute_gradients(loss)capped_gvs = [(tf.clip_by_value(grad, -args.grad_clip, args.grad_clip), var) for grad, var in gvs]optimizer = optimizer.apply_gradients(capped_gvs)embeddings_norm = tf.sqrt(tf.reduce_sum(tf.square(embeddings), 1, keep_dims=True))normalized_embeddings = embeddings / embeddings_normwith tf.Session(graph=graph) as sess:tf.global_variables_initializer().run()for e in range(args.num_epochs): #迭代的次数data_loader.reset_batch_pointer()for b in range(data_loader.num_batches):start = time.time()x, y = data_loader.next_batch()feed = {input_data: x, targets: y}train_loss, _ = sess.run([loss, optimizer], feed)end = time.time()print("{}/{} (epoch {}), train_loss = {:.3f}, time/batch = {:.3f}".format(b, data_loader.num_batches,e, train_loss, end - start))np.save('nnlm_word_embeddings.zh', normalized_embeddings.eval())

具体的分批次 以及分割数据 :

class TextLoader():def __init__(self, data_dir, batch_size, seq_length, mini_frq=3):self.data_dir = data_dirself.batch_size = batch_sizeself.seq_length = seq_lengthself.mini_frq = mini_frqinput_file = os.path.join(data_dir, "text_test.txt")vocab_file = os.path.join(data_dir, "vocab.zh.pkl")self.preprocess(input_file, vocab_file) #处理数据 把文本处理句子成 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 135, 78, 1, 1, 530, 86, 108, 107, 1, 810, 3, 427, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2]self.create_batches()self.reset_batch_pointer()def build_vocab(self, sentences):word_counts = collections.Counter()if not isinstance(sentences, list):sentences = [sentences]for sent in sentences:word_counts.update(sent)vocabulary_inv = ['<START>', '<UNK>', '<END>'] + \[x[0] for x in word_counts.most_common() if x[1] >= self.mini_frq] #进行频率的筛选的过程vocabulary = {x: i for i, x in enumerate(vocabulary_inv)} #每个不重复词的位置id索引字典return [vocabulary, vocabulary_inv]def preprocess(self, input_file, vocab_file):with codecs.open(input_file, 'r', 'utf-8') as f:lines = f.readlines()if lines[0][:1] == codecs.BOM_UTF8:lines[0] = lines[0][1:]lines = [line.strip().split() for line in lines]  #把文本数据全部放到一个list  [['上学','生活'],,,,,,,]self.vocab, self.words = self.build_vocab(lines)  # 一个词的列表 一个是关于字典的词 以及独一无二的词的索引位置self.vocab_size = len(self.words) #统计词量#print 'word num: ', self.vocab_sizewith open(vocab_file, 'wb') as f:cPickle.dump(self.words, f) #把字典的词频系列写进去文档保存raw_data = [[0] * self.seq_length+[self.vocab.get(w, 1) for w in line] +[2] * self.seq_length for line in lines]self.raw_data = raw_data  #把每句话转换成 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 135, 78, 1, 1, 530, 86, 108, 107, 1, 810, 3, 427, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2]#对应的数值为词表里面的id下标,前面的0和后面的2def create_batches(self):xdata, ydata = list(),list()for row in self.raw_data: #row 为每一个句子向量化的东西for ind in range(self.seq_length, len(row)):  #20 60xdata.append(row[ind-self.seq_length:ind])ydata.append([row[ind]]) #下一个单词  目标单词# print(xdata)# print(ydata)# input()#[[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]]#[[1], [94]]self.num_batches = int(len(xdata) / self.batch_size)# print(self.num_batches)# input()if self.num_batches == 0:assert False, "Not enough data. Make seq_length and batch_size small."xdata = np.array(xdata[:self.num_batches * self.batch_size])ydata = np.array(ydata[:self.num_batches * self.batch_size])# print(xdata[:self.num_batches * self.batch_size])# print(ydata)# input()self.x_batches = np.split(xdata, self.num_batches, 0) #分割批次进行喂数据self.y_batches = np.split(ydata, self.num_batches, 0)#分割批次进行喂数据def next_batch(self):x, y = self.x_batches[self.pointer], self.y_batches[self.pointer]self.pointer += 1return x, ydef reset_batch_pointer(self):self.pointer = 0

代码的链接:https://gitee.com/zhoubingbing/rnn_neuroreticulum/tree/master

基于统计生成相似句(同义句),再用神经网络rnn语言模型判断句子的通顺性!相关推荐

  1. 文本数据增强一(概述、中文、同义句生成、enhance、augment、text、nlp)

    文本数据增强(扩充增加.中文.同义句生成.enhance.augment.text.nlp) AugmentText 概述 - 相较于图像数据增强,文本数据增强,现在还是有很多问题的: - 往更严格的 ...

  2. 文本数据增强二(EDA、同义词替换-新增-交换-删除-生成同义句)

    一.中文文本数据增强 (中文.同义句生成.enhance.augment.text.data.nlp.样本不均衡.语料不够.数据不足.扩充增加),相较于图片,中文文本数据强的效果似乎没那么靠谱(效果没 ...

  3. 文本数据增强(EDA、同义词替换-新增-交换-删除-生成同义句)

    在中文数据少的情况下,可以尝试做数据增强,进行 同义词替换-新增-交换-删除-生成同义句,刚好用到,效果还可以,转载一篇使用博客 原文链接: https://blog.csdn.net/rensihu ...

  4. 中文同义句转换器软件.v.1.2.3

    "在赋予人类社会加快发展的能力的同时,人工智能正在逐渐产生新形式的重大风险,这些风险可能危及国家安全和人类安全. 中文同义句转换器软件如下: 1.可能的风险包括人工智能自身的失误.对智能硬件 ...

  5. 有没有同义句转换的软件v.1.2.3

    什么是同义句转换的软件?因为现在要写论文的情况是越来越多了的,除了有编辑人员需要写论文以外,也还有一些学术研究需要写论文,又或者有的是要评职称需要写论文等等,这样的情况都非常常见. 同义句转换的软件截 ...

  6. 基于统计学习---面向新闻的发生地与提及地检测

    基于统计学习---面向新闻的发生地与提及地检测 一.摘要 二.流程 2.1- 数据构建及数据预处理 2.2- 全国5级地址实体二叉树 2.3- 命名实体识别相关算法 2.4- 新闻中特征信息分析 2. ...

  7. NLP——8.基于统计的翻译系统

    基于统计的机器翻译:mosesdecoder作为比对翻译效果的baseline,如果不如这个的效果,就说明测试系统效果不算好. 首先看看一共需要以下三个模型: 语言模型:用来评估这句话的通畅程度. 1 ...

  8. 中文分词算法——基于统计的分词

    1.基于统计的分词(无字典分词) 主要思想:上下文中,相邻的字同时出现的次数越多,就越可能构成一个词.因此字与字相邻出现的概率或频率能较好的反映词的可信度. 主要统计模型为:N元文法模型(N-gram ...

  9. 基于统计复用的分组交换网络拥塞控制的科普解释

    原文链接:https://blog.csdn.net/dog250/article/details/53138144 最近收到很多邮件咨询各种问题,一般而言我能回答的就都回答了,我自有自知之明,绝不是 ...

最新文章

  1. pytorch python区别_pytorch源码解析:Python层 pytorchmodule源码
  2. linux date时间戳互相转换
  3. 无限试用CrossOver 15天的办法
  4. python-websocket-server hacking
  5. 实现自动带密码登陆远程机执行shell命令(linux)
  6. 冠军奖10万日元+10公斤柠檬!一个简单的柠檬图像分级竞赛
  7. 自定义QListWidget实现item被hover时改变图标样式(模仿网易云音乐选项列表)(方法二)
  8. centos7安装git踩坑记
  9. 大数据平台基本功能有哪些
  10. mft文件记录属性头包括_学懂主流NTFS分区文件系统,你也可以成为MM眼中的大神!...
  11. AT2164 AGC006C Rabbit Exercise
  12. 爬虫python下载视频_利用python爬虫通过m3u8文件下载ts视频
  13. 浏览器被hao360,hao123,2345,搜狗,www.xie116.xyz/ 劫持的方法
  14. Pyechart绘制疫情发文可视化动态地图
  15. python 魔法方法(2)
  16. OLED的中英文和图片显示
  17. MatrikonOPC与西门子S7300系列PLC以太网通讯
  18. 前端处理emoji表情的编码解码
  19. exploit-db图文教程
  20. iPhone开发网站、论坛、博客 .

热门文章

  1. SIMS(secondary ion mass spectroscopy)二次离子质谱
  2. 耦合、解耦是什么?怎么做到解耦呢?
  3. 类似爱库存S2B2C的电商源码
  4. 服务器的RAID形式有哪些
  5. Linq 多个DataTable表关联查询,实现考勤统计。
  6. 《坤》:大地之母的胸怀
  7. uniapp获取微信运动步数
  8. 课程设计I《飞机订票系统 》
  9. DDoS 攻击继续激增
  10. java json 压缩_Json压缩工具(示例代码)