基于pyspark的英文文本相似度匹配
原文本文件是txt格式的多文本,数量大约三万个,项目需求是对这些文本进行相似度的匹配,找出哪些文本之间内容是相似的。
文本内容类似如下:
From: kedz@bigwpi.WPI.EDU (John Kedziora)
Subject: Motorcycle wanted.
Organization: Worcester Polytechnic Institute
Lines: 11
Expires: 5/1/93
NNTP-Posting-Host: bigwpi.wpi.edu
Followup-To:kedz@wpi.wpi.edu
Distribution: ne
Organization: Worcester Polytechnic Institute
Keywords:
I am looking for an inexpensive motorcycle, nothing fancy, have to be able to do all maintinence my self. looking in the <$400 range.
if you can help me out, GREAT!, please reply by e-mail.
文本的关键信息主要是标题(subject)和正文部分。
项目环境
linux环境
hadoop2.7.1
spark2.4.5
开发语言:python
项目思路
数据预处理
把一万多个文本数据进行清洗,提取出有效信息(标题+正文),把有效信息合并为一个大的txt文件,合并后文件的每一行与原来的单个txt文件的信息对应。
剔除停用词
剔除原文本里很多的英文常用词,例如am,is,going等,这些常用词汇很容易出现,但是没有办法成为一个句子的代表性词汇,故而必须去掉。
特征工程
首先统计单行句子里的每一个词的TFIDF值,把值比较大的前15个词提出来作为句子的关键词,然后把这些关键词转为word2vec向量,word2vec向量将作为单行文本的特征。
使用LSH模型进行距离筛选
实际上起初我打算使用传统的机器学习方法,构建logistic回归模型或者神经网络模型,做成一个分类模型,但是由word2vec向量构成的训练模型效果很差(三层神经网络的准确率只有百分之十五),在这个方向失败之后,回到LSH模型做出相似性匹配。
LSH即Locality Sensitive has,局部敏感哈希,主要用来解决海量数据的相似性检索。由spark的官方文档翻译为:LSH的一般思想是使用一系列函数将数据点哈希到桶中,使得彼此接近的数据点在相同的桶中具有高概率,而数据点是远离彼此很可能在不同的桶中。spark中LSH支持欧式距离与Jaccard距离。这里我们使用的是欧式距离。由在相同的桶中的数据认为是高概率相似的。
模型结构
数据输入,剔除停用词
StopWords = [] #停用词
with open(r"/usr/local/chinesestopwords.txt") as f:
for i in f.readlines():
i = i.strip('\n')
StopWords.append(i)
def f(x):
rel = {
}
rel['index'] = str(x[0])
seg_list = jieba.cut(str(x[1]))
rel['words'] =[word for word in