preprocessor.ipynb
17.7 KB
文本的预处理
关于这个模块,你并不需要完成任何任务,所有的模块已经写好,你只需要读一读就可以了。输入为question_answer.txt,最后处理之后的结果存放在question_answer_parse.pkl文件中。
In [2]:
import numpy as np import pandas as pd import emoji import re import jieba import os from collections import Counter
In [4]:
# 导入原始数据 QApares_df = pd.read_csv('data/question_answer.txt',sep='\t',header=None)
In [5]:
#观察原始数据格式,查看头几个样本 QApares_df.head()
0 | 1 | |
---|---|---|
0 | 买 二份 有没有 少点 呀 | 亲亲 真的 不好意思 我们 已经 是 优惠价 了 呢 小本生意 请亲 谅解 |
1 | 那 就 等 你们 处理 喽 | 好 的 亲退 了 |
2 | 那 我 不 喜欢 | 颜色 的话 一般 茶刀 茶针 和 二合一 的话 都 是 红木 檀 和 黑木 檀 哦 |
3 | 不是 免 运费 | 本店 茶具 订单 满 99 包邮除 宁夏 青海 内蒙古 海南 新疆 西藏 满 39 包邮 |
4 | 好吃 吗 | 好吃 的 |
In [6]:
# 将 QApares_df列重命名 QApares_df.columns = ['question_before_preprocessing','answer'] QApares_df.head()
question_before_preprocessing | answer | |
---|---|---|
0 | 买 二份 有没有 少点 呀 | 亲亲 真的 不好意思 我们 已经 是 优惠价 了 呢 小本生意 请亲 谅解 |
1 | 那 就 等 你们 处理 喽 | 好 的 亲退 了 |
2 | 那 我 不 喜欢 | 颜色 的话 一般 茶刀 茶针 和 二合一 的话 都 是 红木 檀 和 黑木 檀 哦 |
3 | 不是 免 运费 | 本店 茶具 订单 满 99 包邮除 宁夏 青海 内蒙古 海南 新疆 西藏 满 39 包邮 |
4 | 好吃 吗 | 好吃 的 |
In [7]:
def rm_space(sentence): '''将已分好词的句子去掉词之间的空格变成原句子,如将‘那 就 等 你们 处理 喽’改为‘那就等你们处理喽’''' return ''.join(sentence.split()) QApares_df['question'] = QApares_df.question_before_preprocessing.apply(rm_space) QApares_df['answer'] = QApares_df.answer.apply(rm_space)
In [9]:
QApares_df.head()
question_before_preprocessing | answer | question | |
---|---|---|---|
0 | 买 二份 有没有 少点 呀 | 亲亲真的不好意思我们已经是优惠价了呢小本生意请亲谅解 | 买二份有没有少点呀 |
1 | 那 就 等 你们 处理 喽 | 好的亲退了 | 那就等你们处理喽 |
2 | 那 我 不 喜欢 | 颜色的话一般茶刀茶针和二合一的话都是红木檀和黑木檀哦 | 那我不喜欢 |
3 | 不是 免 运费 | 本店茶具订单满99包邮除宁夏青海内蒙古海南新疆西藏满39包邮 | 不是免运费 |
4 | 好吃 吗 | 好吃的 | 好吃吗 |
接下来对数据进行预处理
In [10]:
# 清洗数据 def clean(content): #将数据中的emoji表情转化为文字 content = emoji.demojize(content) #过滤其中的html标签 content = re.sub('<.*>','',content) return content
In [11]:
# 对每个问题应用上一clean函数进行清洗 QApares_df['question_after_preprocessing'] = QApares_df['question_before_preprocessing'].apply(clean)
In [12]:
# 按照一般的流程,之后应该是对问题进行分词,但由于我们的数据已经是分好词的数据,所以这里不再进行中文分词,而是直接将分好的词以列表的形式存储。 QApares_df['question_after_preprocessing'] = QApares_df['question_after_preprocessing'].apply(lambda x:x.split())
In [13]:
# 对question_after_preprocessing列去除单词中的空格回车等符号 def strip(wordList): return [word.strip() for word in wordList if word.strip()!=''] QApares_df['question_after_preprocessing'] = QApares_df['question_after_preprocessing'].apply(strip)
In [15]:
# 读取data/stopWord.json中保存的的停用词表,并保存在列表中 # 中文停用词表的下载地址:https://github.com/goto456/stopwords/ with open("data/stopWord.json","r") as f: stopWords = f.read().split("\n")
In [16]:
# 去除停用词 def rm_stop_word(wordList): return [word for word in wordList if word not in stopWords] QApares_df['question_after_preprocessing'] = QApares_df['question_after_preprocessing'].apply(rm_stop_word)
In [17]:
# 去除低频词 allWords = [word for question in QApares_df['question_after_preprocessing'] for word in question] #所有词组成的列表 freWord = Counter(allWords) #统计词频,一个字典,键为词,值为词出现的次数 highFreWords = [word for word in freWord.keys() if freWord[word]>5] # 词频超过5的词列表, 剩下的词去掉 def rm_low_fre_word(content): return [word for word in content if word in highFreWords] # 去除低频词 QApares_df['question_after_preprocessing'] = QApares_df['question_after_preprocessing'].apply(rm_low_fre_word)
In [18]:
# 只保留question,answer和question_after_preprocessing列 QApares_df = QApares_df[['question','answer','question_after_preprocessing']] #查看预处理之后的数据 QApares_df.head()
question | answer | question_after_preprocessing | |
---|---|---|---|
0 | 买二份有没有少点呀 | 亲亲真的不好意思我们已经是优惠价了呢小本生意请亲谅解 | [买, 二份, 有没有, 少点] |
1 | 那就等你们处理喽 | 好的亲退了 | [处理] |
2 | 那我不喜欢 | 颜色的话一般茶刀茶针和二合一的话都是红木檀和黑木檀哦 | [喜欢] |
3 | 不是免运费 | 本店茶具订单满99包邮除宁夏青海内蒙古海南新疆西藏满39包邮 | [免, 运费] |
4 | 好吃吗 | 好吃的 | [好吃] |
In [19]:
#由于保存为csv格式会将数据默认保存为str格式,但我们的数据中question_after_preprocessing列中每一项为列表形式,保存为csv格式会增加我们后面处理数据的难度,所以这里我们将保存为pickle形式 import pickle with open('data/question_answer_pares.pkl','wb') as f: pickle.dump(QApares_df,f)