这是我参与「第三届青训营 -后端场」笔记创作活动的的第11篇笔记」
相关搜索调研
比如你搜索苹果电脑 ,你发现结果不怎么好,你自己会把搜索词改成apple笔记本电脑 ,然后找到你需要的东西,这个apple笔记本电脑 就是你这次搜索行为中苹果电脑 的后继词 了,所以这种行为是我们可用的,这相当于让用户帮你找近义词。
近义词匹配,用户行为(搜索记录-【后继词】和点击记录,浏览记录)
方法
法1:(考虑用户搜索行为)
- 数据: 搜索日志记录如下
key:搜索词 time:搜索时间 cookie:用户cookieid result:a,b,c,d,e(前5个搜索结果)
- 预处理:原始日志到后继词表的转换
- keys【一段时间内的搜索记录】
cookie:用户cookieid keys:[A1第一次搜索,A2第二次搜索.....] [B1,B2.....] [C1,C2.....]
- 后继词表1:
key:A succeed:A1,A2,A3..…
- 相关推荐过程:搜索词,在后继词表中查询匹配的key, 返回相关推荐succeed top10
法2:(考虑用户搜索行为)
在法1基础上增加协同过滤算法
协同过滤输入(某些用户+后继词,【某些用户+后继词表】)?
后继词表2=协同过滤<搜索词,后继词表1>
相关推荐过程:输入搜索词,协同过滤<搜索词,后继词表2>,输出后继词结果?
or
相关推荐过程:输入搜索词,查询后继词表2,输出后继词结果?
or
相关推荐过程:输入搜索词,查询后继词表2,得到一行(key,后继词)-》协同过滤<查询结果(key,后继词),后继词表2>,输出后继词结果?
法3:(考虑搜索词之间的相关性)
【生成后继词表的计算量很大】
- 数据:搜索日志处理
key:搜索词 time:搜索时间 cookie:用户cookieid result:a,b,c,d,e(前5个搜索结果)-》处理:
key:搜索词A result:a,b,c,d,e(前5个搜索结果)
key:搜索词B result:a,f,c,g,m(前5个搜索结果)
- 预处理:计算key搜索词之间的相似度(相似度算法)
- 后继词表
key:搜索词A succeed:搜索词B(0.8) 搜索词C(0.6)..... key:搜索词B succeed:搜索词A(0.8) 搜索词E(0.7).....
法4:考虑搜索词的结果集之间的相关性
【效果可能较好】
(结果集是相关推荐结果还是全文搜索的文本?)
搜索词A、B的结果集存在的交集,如果交集里的搜索结果被点击了,A B词的相关性很高
- 数据:搜索日志记录如下
key:搜索词A click:结果A 结果B 结果C
- 相关推荐过程:输入搜索词,协同过滤<搜索词,click>,输出后继词(click)结果
实际流程
离线预处理:
使用法2or法4?
- 首先,原始数据来源需要做预处理,生成一个统一的数据结构供后续的节点使用,这个相当于原始数据。
- 从原始数据出来以后会分成两组数据进入不同的节点,下面这个节点用来做
协同过滤的,先对数据进行二次加工,上面这个节点用来做word2vec,也是对数据进行二次加工,加工成算法需要的数据格式。
- 第三层节点就是具体的算法模块了,数据按照格式要求输入,然后输出成需要的数据格式供在线平台使用。
在线相关推荐过程:
搜索词-》分词,找到中心词-》处理后的搜索词-》后继词表查询
协同过滤有两个地方??
- 日志预处理生成后继词表阶段
- 用户在线搜索过程中
一个搜索词的轮回,从搜索引擎产生搜索词的日志,到最后又变成了一个个的推荐搜索词,然后这些个搜索词又可以进入到搜索日志中,继续优化这个系统。——日志更新,后继词表更新
协同过滤怎么使用?
数据来源?
1、法1 法2 需要考虑用户搜索行为,如何生成数据?
2、抓取搜索引擎的相关搜索结果,直接建立后继词表
存在问题:ip验证码
测试:
#相关搜索关键词抓取,读取txt关键词,导出txt关键词
# -*- coding=utf-8 -*-
import requests
import re
import time
from multiprocessing.dummy import Pool as ThreadPool
import re,urllib.parse,urllib.request,urllib.error
from bs4 import BeautifulSoup as BS
import csv
import requests,re,time
#360相关关键词查询
def xgss(url_keyword):
url = url_keyword[0]
keyword = url_keyword[1]
print(url)
res_arr = []
try:
html = urllib.request.urlopen(url)
except urllib.error.HTTPError as e:
print(e.code)
except urllib.error.URLError as e:
print(e.reason)
soup = BS(html, "html.parser")
td = soup.findAll('th')
# print(td)
count = soup.findAll(class_="rs-table")
for c in count:
pattern = re.compile(r'>([^"]*)</a>')
print("___", c.get_text())
gjc = ''
for t in td:
# print(t.get_text())
pattern = re.compile(r'>([^"]*)</a>')
h = re.search(pattern, str(t))
if h:
for x in h.groups():
print(x)
res_arr.append(x)
gjc = gjc + x + '\n'
# 导出关键词为txt文本
with open("./gjcsj.txt", 'a', encoding='utf-8') as f:
f.write(gjc)
print("-----------------------------------")
data_csv.append([keyword, res_arr])
return gjc
print("程序运行,正在导入关键词列表!!!")
print("-----------------------------------")
# 导入要搜索的关键词txt列表
urls = []
data = []
data_csv = []
for line in open('./gjc.txt', "r", encoding='utf-8'):
print(line)
data.append(line)
print("导入关键词列表成功!")
print("-----------------------------------")
#转换关键词为搜索链接
for keyword in data:
# baseUrl = 'http://cn.bing.com/search?'
baseUrl = 'https://www.so.com/s?ie=utf-8&fr=none&src=360sou_newhome&ssid=&q=' # 360搜索, 9个相关搜索结果
# keyword = '余弦相似度'
print(keyword)
org_keyword = keyword
keyword = keyword.encode(encoding='utf-8', errors='strict')
# print(word)
data = {'q': keyword}
data = urllib.parse.urlencode(data)
# print(data)
url = baseUrl + data
urls.append([url, org_keyword])
print("采集相关搜索关键词开启!")
print("...................")
#多线程获取相关关键词
try:
# 开4个 worker,没有参数时默认是 cpu 的核心数
pool = ThreadPool()
results = pool.map(xgss, urls)
pool.close()
pool.join()
print("采集相关搜索关键词完成,已保存于gjcsj.txt!")
except:
print("Error: unable to start thread")
print("8s后程序自动关闭!!!")
time.sleep(8)
f = open('./result.csv', 'w', encoding='utf-8', newline="")
csv_writer = csv.writer(f)
csv_writer.writerow(["关键词","后继词"])#可省略
for d in data_csv:
print(d)
csv_writer.writerow(d)
f.close()
360搜索 测试 csv如下
搜索词,相关推荐结果9个
['百度搜索\n', ['百度一下搜索引擎', '百度搜索转子平衡机', '百度营销搜索推广', '百度首页百度i问财', '百度搜索一下你就知道', '百度云资源搜索', '百度搜索拖链易格斯', '云铺子搜索引擎', '点击进入百度搜索']]
['字节跳动\n', ['字节跳动招聘官网首页', '字节跳动官网入口', '短视频内容电商运营招聘', '字节跳动bd岗位怎么样', '字节跳动公司简介', '字节跳动1075工作制', '字节跳动官网首页', '字节跳动旗下产品', '什么叫字节跳动']]
['搜索引擎', ['阿里云搜索引擎入口', '谷歌搜索引擎首页', '搜索引擎网站排名', '搜搜搜索引擎', '爬虫搜索引擎', '网址搜索引擎', '电影狗搜索引擎', '万能搜索引擎', 'google搜索引擎入口']]
参考文章
(54条消息) 使用PHP的curl爬取百度搜索页相关搜索词_Ersan_Yi的博客-CSDN博客_php模拟百度搜索
Python循环获取百度相关搜索关键词 - 思享SEO博客 (4xseo.com)
(54条消息) 抓取百度&搜狗相关搜索、筛选文本相似度最高的相关搜索(PHP)_猿人日记的博客-CSDN博客 相关搜索 --- 搜索中的推荐 - SegmentFault 思否