短语,多关键词查询,比如"python编程视频",大致处理逻辑是
1、先分词,得到["python","编程","视频"]
2、我这里规定只要name字段包含>=2个词即可检索出来,比如下图中,
["python",“编程”],["python","视频"]这些都是可以检索出来的,当然["编程","视频"]这种也是可以检索出来的,只是页数较多,不再截图
下方代码,主要业务逻辑在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、编程、视频的索引号
all_true_index_list:将上面三个列表append到一个大列表
all_index = get_and_list(first_list, all_true_index_list),将上一步[[ ],[ ],[ ]]展开,变成[ ]形式,后面会有具体原因,为了这里不断思路,展开实现代码也放到文末,这里先放上展开的列表的截图
做展开的目的是这样的,举个数据少点好说明问题的简单例子,假如
包含"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爬虫人工智能大数据公众号