公司实习需要做用户热搜词相似度计算以为用户搜索推荐提供相关信息,主要使用了两种算法实现词相似度计算:LDA和Word2Vector(参考spark algorithm)
(目前Word2Vector算法效果更好,LDA对于词频较高的词会发生结果中出现次数过多的情况)
算法所需数据来源:
1.商品信息。
2.用户搜索历史记录。
3.标准词表,用来补充搜索历史记录以提升结果精度。
4.停止词表。
数据预处理:
由于直接对商品分词效果非常差,因此使用搜索历史、标准词表和停止词表结合的方式将商品信息转为为词向量。
对Deal_infos信息处理过程为:
通过停止表过滤搜索历史表加标准词表中的词,其它过滤条件代码如下:
private val wordTable: Set[String] = if (searchLogPath.isEmpty) {
Set.empty[String]
} else {
//根据停止表清洗搜索词表
val stopWords = sc.textFile(stopWordPath).collect()
//获取搜索关键词
val searchLog = sc.textFile(searchLogPath).map { f =>
f.split("\\|")(0)
}
//标准词
val standardWord = sc.textFile(standardWordPath)
val allWords = searchLog.++(standardWord).collect()
val result = new ArrayBuffer[String]()
for (line <- allWords) {
if (!stopWords.contains(line)
&& line.length > 1
&& !line.matches("[0-9]+[.]*[0-9]*")
&& !line.endsWith("元")) {
if (line.matches("[a-z|A-Z|0-9]+")) {
if (line.length > 3) {
result += line
}
} else {
result += line
}
}
}
result.toSet
}
然后将过滤后的词表和商品信息做匹配,使用存在于商品信息中的词作为该商品的关键词。
算法上线后模块用户点击率大幅提升(与没有推荐算法相比提升3~4倍),效果良好。