目录
注:此笔记为《短文本标题相似度检测及计算》课程学习笔记。笔记顺序为编写代码顺序。
本project分析一些新闻条目,并输出最相似的新闻标题组。
GlobalParameter.py
首先对于project中的各种文件路径和训练参数进行设置,该文件中的所有代码如下:
# 各种设置
encoding = "utf-8" # 文件编码设置,utf-8为中文
stop_word_dir = "data/stop_words.txt" # 停止词的文件路径
train_set_dir = "data/train.csv" # 原始训练集路径
train_after_process_text_dir = "data/train_after_process.csv" # 处理后训练集路径
test_set_dir = "data/test.csv" # 原始测试集路径
test_after_process_text_dir = "data/test_after_process.csv" # 处理后测试集路径
model_output_path = "model\word2vec_news.model" # 训练好的word2vec模型的路径;win系统下/和\没有本质区别
train_num = 485686
test_num = 50
result_out_path = "data/sim_result.csv"
sim_result_path = "data/result.txt"
# word2vec参数
train_size = 150
train_window = 5
utils.py
编写一些对于数据集的处理函数(预处理 + 分词)。
拿test.csv举例,原始数据的样子:
id,title
2784,美国地质勘探局:印度莫黑安东南部151公里处发生5.1级地震
12057,美国MBA抵押贷款申请指数上周上升2.7%。
19620,美国德州市长:预计将向印度供应更多的原油和液化天然气。
23768,欧洲央行月报:仍需要足够程度的货币宽松。
23814,IMF:2017年11月委内瑞拉黄金持有量下降6.373吨至184.939吨。
28091,YTN:朝鲜金正恩称,他将会和美国举行峰会
34581,美国副总统彭斯:(就朝鲜问题)为所有可能的结果做好准备将对任何核武器的使用进行快速应对
46930,香港财政司长陈茂波:需要继续留意全球货币环境和地缘政治的变化与政策风险。
读取stop_words
stop_words是停止词,一般是类似于“的”、“地”等出现次数极高但无太大语义的词语。在干任何事情之前,应该先处理下载的stop_words文档,提取出所有停止词。
def get_stop_words(stop_words_dir):
stop_words = [] # 保存所有停止词在stop_words的list中
with open(stop_words_dir, "r", encoding=GlobalParameter.encoding) as f_reader: # 打开stop_words文件
for line in f_reader:
line = delete_r_n(line) # 最简单的处理方式,去掉回车和换行
stop_words.append(line)
stop_words = set(stop_words) # 以防有重复词
return stop_words
def delete_r_n(line):
return line.replace("\r", "").replace("\n", "").strip()
对训练集进行分词
接下来对于训练集中的完整的句子,用停止词和jieba包进行分词。jieba 是目前最好的 Python 中文分词组件,支持三种模式(精确模式、全模式、搜索引擎模式)。可使用 jieba.cut ()和 jieba.cut_for_search ()方法进行分词,两者所返回的结构都是一个可迭代的 generator,可以使用 for 循环来获得分词后得到的每一个词语。
对“我就读于北京航空航天大学,现是一名大三学生。”进行分词:
jieba,cut(): [‘就读于’, ‘北京航空航天大学’, ‘现是’, ‘一名’, ‘大三’, ‘学生’]
jieba.cut_for_search (): [‘就读’, ‘就读于’, ‘北京’, ‘航空’, ‘空航’, ‘航天’, ‘天大’, ‘大学’, ‘北京航空航天大学’, ‘现是’, ‘一名’, ‘大三’, ‘学生’]
两种分词方式的代码,返回对都是word_list,即处理后的所有词。
# jieba精确分词
def jieba_cut(content, stop_words):
word_list = []
if content != "" and content is not None:
seg_list = jieba.cut(content)
for word in seg_list:
if word not in stop_words:
word_list.append(word)
return word_list
# jieba搜索引擎分词
def jieba_cut_for_search(content, stop_words):
word_list = []
if content != "" and content is not None:
seg_list = jieba.cut_for_search(content)
for word in seg_list:
if word not in stop_words:
word_list.append(word)
return word_list
由于还有后续步骤,对训练集分词后的结果不在此展示了。
对训练集进行预处理的整个过程
写好了前面几个处理函数之后,编写整个处理训练集的过程。
第一种处理函数:
def preprocessing_text_pd(text_dir, after_process_text_dir, stop_words_dir):
stop_words = get_stop_words(stop_words_dir) # 读取停用词
sentences = []
df = pd.read_csv(text_dir) # 读取原始数据集
for index, row in df.iterrows(): # df.iterrows为在pandas中遍历DataFrame行;index是编号;row是title项的内容
title = delete_r_n(row['title']) # title为初处理之后的一个string
word_list = jieba_cut(title, stop_words) # 对于每个句子进行处理,保存入word_list中
df.loc[index, 'title'] = " ".join(word_list) # df.loc[]是数据选取函数,有多种选取方法
sentences.append(word_list)
df.to_csv(after_process_text_dir, encoding