【网站技术解析⑨】-- 检索系统实现(二)

短语,多关键词查询,比如"python编程视频",大致处理逻辑是

1、先分词,得到["python","编程","视频"]

2、我这里规定只要name字段包含>=2个词即可检索出来,比如下图中,

["python",“编程”],["python","视频"]这些都是可以检索出来的,当然["编程","视频"]这种也是可以检索出来的,只是页数较多,不再截图


640?wx_fmt=jpeg


下方代码,主要业务逻辑在if len(all_true_index_list)>2

cut_list = list(jieba.cut(msg))
all_true_index_list = []
for word in cut_list:
   each_true_index_list = get_true_index(df, word)
   all_true_index_list.append(each_true_index_list)
print("所有列表[[],[],[]]", all_true_index_list)

if len(all_true_index_list) >= 2:
   first_list = all_true_index_list[0]
   all_index = get_and_list(first_list, all_true_index_list)
   print("铺平的列表", all_index)
   print(dict(Counter(all_index)))
   dayu2 = pd.Series(dict(Counter(all_index)))
   print(dayu2)
   dayu2_index = dayu2[dayu2 >= 2].index
   filter_index = dayu2_index.tolist()
   filter_data = df.iloc[filter_index]
else:
   filter_data = df.iloc[all_true_index_list[0]]
filter_data = filter_data[["name", "url"]]


对于上面的"python编程视频"

cut_list : 分词后为["python","编程","视频"]

each_true_index_list : 调用get_true_index方法,返回包含每个关键词的dataframe的索引号,下方3个截图分别是:包含python编程视频的索引号

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg


all_true_index_list:将上面三个列表append到一个大列表

640?wx_fmt=jpeg


all_index = get_and_list(first_list, all_true_index_list),将上一步[[ ],[ ],[ ]]展开,变成[ ]形式,后面会有具体原因,为了这里不断思路,展开实现代码也放到文末,这里先放上展开的列表的截图

640?wx_fmt=jpeg


做展开的目的是这样的,举个数据少点好说明问题的简单例子,假如

包含"python”的索引为:[1,2,3,5,8,9]

包含“编     程”的索引为:  [ 1,3,8,9]

包含"视     频"的索引为:  [1,5,9]

则按照上面的步骤,需要先构造成[[1,2,3,5,8,9], [ 1,3,8,9],[1,5,9]]

再展开,展开列表为 [1,2,3,5,8,9,1,3,8,9,1,5,9]

拿到这个展开的索引列表,我只要统计出这个列表的索引号>=2次,则认为至少包含了2个词,这是我设定的短语检索规则(核心逻辑,好好琢磨)

好了,如何统计[1,2,3,5,8,9,1,3,8,9,1,5,9]每个元素的出现次数?

我这里直接用ipython演示一段代码,用Countet来统计,具体结果清晰明了,

本文的业务逻辑哪怕你不是那么清楚,但是能掌握下面这个库也是不错的,有些时候很有用,因为真实数据多为了更直观,我转化成了Series结构

In [3]: from collections import Counter
In [4]: a = [1,2,3,5,8,9,1,3,8,9,1,5,9]
In [5]: dict(Counter(a))
Out[5]: {1: 3, 2: 1, 3: 2, 5: 2, 8: 2, 9: 3}
In [6]: import pandas as pd
In [7]: pd.Series(dict(Counter(a)))
Out[7]:
1 3
2 1
3 2
5 2
8 2
9 3
dtype: int64


理解了上面,基本就没什么疑问了,通过下面方法拿到出现次数大于2的索引,在通过iloc获取数据,最后返回

dayu2 = pd.Series(dict(Counter(all_index)))
print(dayu2)
dayu2_index = dayu2[dayu2 >= 2].index
filter_index = dayu2_index.tolist()
filter_data = df.iloc[filter_index]


最后:文中疑问,列表如何展开?

可能看起来有点费劲,但是用到了递归思想,自己琢磨琢磨尝试尝试吧,如果有好的展开个数不一致的多层嵌套列表结构,欢迎留言或者加我微信交流,共同学习提高

def get_and_list(first_list, list):
   a = list[0]
   list.remove(a)
   first_list.extend(list[0])
   if len(list) > 1:
     get_and_list(first_list, list)
   return first_list


python爬虫人工智能大数据公众号

640?wx_fmt=gif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值