一、环境搭建

sys (python系统库)
pickle(将特有的类型与python的数据类型进行转换的库)
re (正则表达式库)
tqdm(可扩展的进度条)

activate nlp,pip install tqdm --upgrade

二、聊天机器人语料处理流程介绍

1、语料收集:聊天记录、电影对话、台词片段

2、语料清洗:

清洗的内容:多余的空格,不正规的符号,多余的字符、英文

清洗的方法:正则化,切分,好坏语句判断

3、句子向量的编码化:
原始的文本不能直接训练
将句子转换成向量
将向量转换成句子

4、语料问答对的构建

5、语料模型的保存

三、、数据处理

数据集 dgk_shooter_min.conv

创建extract_conv.py文件

# -*- coding:utf-8 -*-import re
import pickle
import sys
from tqdm import tqdm#########句子的构造和判断#############def make_split(line):# 数据处理,如果有这些字符用空替换# 如 你好?我是recky...  变为 你好我是reckyif re.match(r'.*([,···?!\.,!?])$', ''.join(line)):return []# 用空格切分,逗号隔开return [', ']# 判断句子是不是有用的句子
def good_line(line):# 判断包含大于2个的字母数字等,如果很多就不是好句子if len(re.findall(r'[a-zA-Z0-9]', ''.join(line))) > 2:return Falsereturn True##########正则表达式###########
# 英文字符替换为中文字符 如 你好? 转换为 你好?
def regular(sen):# .连续出现3-100次,替换成...sen = re.sub(r'\.{3,100}', '···', sen)# ...连续出现2-100次,替换成...sen = re.sub(r'···{2,100}', '···', sen)sen = re.sub(r'[,]{1,100}', ',', sen)sen = re.sub(r'[\.]{1,100}', '。', sen)sen = re.sub(r'[\?]{1,100}', '?', sen)sen = re.sub(r'[!]{1,100}', '!', sen)return sen# 主函数,句子最长20
def main(limit=20, x_limit=3, y_limit=6):############# 句子编码化处理(字典定义及转换)看word_sequence文件#############from word_sequence import WordSequenceprint('extract lines')fp = open('dgk_shooter_min.conv', 'r', errors='ignore', encoding='utf-8')groups = []group = []for line in tqdm(fp):  # 进度条if line.startswith('M '):  # 数据是M开头的是句子line = line.replace('\n', '')  # 去掉回车if '/' in line:  # 有/就用/做切分line = line[2:].split('/')else:line = list(line[2:])line = line[:-1]group.append(list(regular(''.join(line))))else:if group:groups.append(group)group = []if group:groups.append(group)group = []print('extract group')####################训练语料问答对的处理#################### 定义问答语句x_data = []y_data = []for group in tqdm(groups):# enumerate枚举group,返回标签i,句子linefor i, line in enumerate(group):last_line = None  # 最后一句设置为空if i > 0:  # 说明里面至少2行,0,1行last_line = group[i - 1]  # 拿到最后一行if not good_line(last_line):  # 如果不是好的句子就丢弃last_line = Nonenext_line = None  # 下一行if i < len(group) - 1:next_line = group[i + 1]if not good_line(next_line):next_line = Nonenext_next_line = None  # 下下句if i < len(group) - 2:next_next_line = group[i + 2]if not good_line(next_next_line):next_next_line = None# 拿到3行数据做赋值if next_line:  # 存在下一行x_data.append(line)  # 问句追加,x赋值第一行y_data.append(next_line)  # 答句y赋值第二行if last_line and next_line:  # 有第一行和下一行x_data.append(last_line + make_split(last_line) + line)  # 下一行+下一行make_split切分+当前行y_data.append(next_line)if next_line and next_next_line:x_data.append(line)y_data.append(next_line + make_split(next_line) + next_next_line)print(len(x_data), len(y_data))# 构建问答,zip是把数据整合为列表,最多20个字符for ask, answer in zip(x_data[:20], y_data[:20]):print(''.join(ask))print(''.join(answer))print('-' * 20)###############数据模型打包处理############### 生成pkl文件备用data = list(zip(x_data, y_data))data = [(x, y) for x, y in data if limit > len(x) >= x_limit and limit > len(y) >= y_limit]x_data, y_data = zip(*data)ws_input = WordSequence()  # 句子编码化处理ws_input.fit(x_data + y_data)  # 训练数据print('dump')pickle.dump((x_data, y_data), open('chatbot.pkl', 'wb'))pickle.dump(ws_input, open('ws.pkl', 'wb'))print('done')if __name__ == '__main__':main()
创建word_sequence.py
# -*- coding:utf-8 -*-import numpy as np############## 句子编码化处理(字典定义及转换)#############
#训练就是把句子转换为向量
class WordSequence(object):# 定义标记,pad填充,用来补位,unk未知PAD_TAG = '<pad>'UNK_TAG = '<unk>'START_TAG = '<s>'END_TAG = '</S>'PAD = 0UNK = 1START = 2END = 3# 字典初始化def __init__(self):self.fited = False  # 是否训练self.dict = {WordSequence.PAD_TAG: WordSequence.PAD, WordSequence.UNK_TAG: WordSequence.UNK,WordSequence.START_TAG: WordSequence.START, WordSequence.END_TAG: WordSequence.END}# 把字转化为indexdef to_index(self, word):assert self.fited, 'WordSequence尚未进行fit操作'# 在字典里。返回位置if word in self.dict:return self.dict[word]return WordSequence.UNK# 把index转化为字def to_word(self, index):assert self.fited, 'WordSequence尚未进行fit操作'for k, v in self.dict.items():if v == index:return kreturn WordSequence.UNK_TAG# 大小def size(self):assert self.fited, 'WordSequence尚未进行fit操作'return len(self.dict) + 1#字典长度进行补位def __len__(self):#重写系统方法return self.size()##############句子编码化处理(训练字典)############### sentences句子,最小出现次数,最大出现次数,最大特征数def fit(self, sentences, min_count=5, max_count=None, max_features=None):assert not self.fited, 'WordSequence只能fit一次'# 拟合的过程count = {}# 传进来的句子拿出来之后进行统计for sentence in sentences:arr = list(sentence)for a in arr:if a not in count:  # 没有被统计count[a] = 0count[a] += 1  # 被统计了# 首先看是不是大于最小值if min_count is not None:# 大于最小值进行key value 的统计count = {k: v for k, v in count.items() if v >= min_count}# 小于最大值进行key value 的统计if max_count is not None:count = {k: v for k, v in count.items() if v <= max_count}self.dict = {WordSequence.PAD_TAG: WordSequence.PAD, WordSequence.UNK_TAG: WordSequence.UNK,WordSequence.START_TAG: WordSequence.START, WordSequence.END_TAG: WordSequence.END}# isinstance是用来判断内容是不是已知的类型if isinstance(max_features, int):  # 判断是不是int类型# 统计count是list每个item排序count = sorted(list(count.items()), key=lambda x: x[1])# 最大特征数不为空且做统计的长度大于最大特征数if max_features is not None and len(count) > max_features:count = count[-int(max_features):]for w, _ in count:  # 把长度放入字典中,第w个=字典长度self.dict[w] = len(self.dict)else:  # 不是int类型,直接把长度放入字典中for w in sorted(count.keys()):  # key排序self.dict[w] = len(self.dict)  # 第w个=字典长度self.fited = True  # 标志###############句子和向量之间的转换############# 句子转换为向量def transform(self, sentence, max_len=None):assert self.fited, 'WordSequence尚未进行fit操作'if max_len is not None:r = [self.PAD] * max_len  # 填充的位置*最大长度else:r = [self.PAD] * len(sentence)  # 填充的位置*句子长度for index, a in enumerate(sentence):  # 在枚举句子中if max_len is not None and index >= len(r):breakr[index] = self.to_index(a)return np.array(r)  # 转换为numpy的array# 向量转换为句子def inverse_transform(self, indices, ignore_pad=False, ignore_unk=False, ignore_start=False, ignore_end=False):ret = []for i in indices:word = self.to_word(i)  # 转换完的字if word == WordSequence.PAD_TAG and ignore_pad:continueif word == WordSequence.UNK_TAG and ignore_unk:continueif word == WordSequence.START_TAG and ignore_start:continueif word == WordSequence.END_TAG and ignore_end:continueret.append(word)return retdef test():ws = WordSequence()ws.fit([['你', '好', '啊'], ['你', '好', '哦'], ])indice = ws.transform(['我', '们', '好'])print(indice)back = ws.inverse_transform(indice)print(back)if __name__ == '__main__':test()

五、NLP聊天语料处理相关推荐

  1. nlp对语料进行分类_如何使用nlp对推文进行分类

    nlp对语料进行分类 Over the years, we have seen Twitter evolve from just a social media to also a business a ...

  2. 二十九、重磅:近1GB的三千万聊天语料供出

    经过半个月的倾力打造,建设好的聊天语料库包含三千多万条简体中文高质量聊天语料,近1G的纯文本数据.此语料库全部基于2万部影视剧字幕,经由爬取.分类.解压.语言识别.编码识别.编码转换.过滤清洗等一系列 ...

  3. 自己动手做聊天机器人 二十九-重磅:近1GB的三千万聊天语料供出

    Reference: http://www.shareditor.com/blogshow/?blogId=112 经过半个月的倾力打造,建设好的聊天语料库包含三千多万条简体中文高质量聊天语料,近1G ...

  4. python小黄鸡nlp聊天机器人

    python小黄鸡nlp聊天机器人 # encoding: utf-8import osimport tensorflow as tf import numpy as npfrom SequenceT ...

  5. 【C#+SQL Server】实现模仿QQ的交友软件 五:聊天窗体设计讲解(附源码和资源)

    需要源码和资源请 点赞关注收藏后评论区留言私信~~~ 其他几个部分文章链接如下 [C#+SQL Server]实现模仿QQ的交友软件 一:系统简介.功能展示与数据库设计(附源码和资源) [C#+SQL ...

  6. 微信小程序聊天语料收集平台技术总结

    最近接了个项目要求要做微信小程序聊天的,似乎和实验室收集语料数据有关,这里对要用到的技术简单做个记录,主要怕自己忘记了. 估计项目需要很多个GitHub模块聚合在一起 模块1:聊天室 目前先部署了 e ...

  7. NLP聊天机器人的搭建(chatbot)(一)

    最近在学习研发QA系统,本人单纯想记录一下.项目源码和思路主要参考知乎专栏: PyTorch搭建聊天机器人(一)词表与数据加载器 - 知乎 PyTorch搭建聊天机器人(二)定义seq2seq网络前向 ...

  8. Android即时通讯--仿QQ即时聊天:(五)聊天模块

    1.复杂ListView的展示 聊天模块其实就是一个复杂的ListView,在数据适配器中,从application中获取到当前登录的用户,与聊天消息中的from参数进行比较,如果两者相同则说明是自己 ...

  9. NLP+VS︱深度学习数据集标注工具、图像语料数据库、实验室搜索ing..

    一.NLP标注工具 来源:<构想:中文文本标注工具(附开源文本标注工具列表)> Chinese-Annotator   来源:https://github.com/crownpku/Chi ...

最新文章

  1. 自己动手,打造轻量级VSCode/C#环境代替LinqPad
  2. 某米浏览器黑名单文件破解
  3. 应用 Valgrind 发现 Linux 程序的内存问题 [转]
  4. 十六进制时间戳转换成十进制时间戳
  5. 把之前写的几个项目放到了github上
  6. 台湾一校长震动所有中国人的演讲
  7. 使用category 01同时下载3个hierarchy equipment
  8. C语言在计算机专业的功能,C语言程序设计在高职院校计算机专业教学中重要作用.pdf...
  9. 机器学习之决策树熵信息增量求解算法实现
  10. python3 多继承搜索__init__方法的两种策略
  11. phpmyadmin在centos 7中安装
  12. 点击复制,兼容ios-safari
  13. 手推公式+项目实操复现!《机器学习》完整详解
  14. 【STC15W402AS程序下载问题】
  15. Part 66 - Check及Uncheck所有CheckBox 同时删除多行数据记录的实现
  16. java的inputbox_InputBox函数的使用方法
  17. EKL日志平台架构概括
  18. 遛狗已经不流行,“遛”智能购物车成为新潮流
  19. 【USACO 2007 February Silver】农场派对
  20. 读取身份证信息系统的程序编写

热门文章

  1. 第五章 定积分及其应用
  2. Android,翻转卡片动画,实现翻转卡片的动画效果
  3. xtrareport 修改行颜色
  4. ESP12f/E(8266)以及STM32串口自动烧录电路
  5. 这批机器学习工具资源,够你用到长胡子了
  6. 思维题:一个岛上有100个人,95个蓝眼睛,5个红眼睛
  7. CentOS_7配置静态ip地址
  8. 通过 Dockerfile 搭建标注工具 brat 的镜像
  9. 嵌入式了解 以及学习路线
  10. 计算机无法切换用户权限,“无法更改的Administrator账户密码”的解决方案