Python实现考虑搜索排名权重的词云生成方法
带排名权重的电商搜索热词词云实现方案
你之前用的CountVectorizer、TF-IDF、WordCloud默认方法不好用,核心原因是前两个工具的权重计算逻辑只基于词的出现频率,完全没接入外部的搜索排名维度,WordCloud默认也是从传入的原始文本里统计词频,当然没法按排名设权重。
不用魔改这些工具的源码,自己算完词权重直接喂给工具就行,整个流程3步就能跑通:
1. 定义排名到短语权重的映射规则
排名越靠前的搜索短语权重越高,最通用的映射是倒数权重法:排名为r的搜索短语,整条短语的基础权重为1/r。按这个规则,第1名权重为1,第2名权重0.5,第100名权重仅0.01,天然符合头部词权重更高的要求。
如果想进一步拉大头部Top10/Top20热词的权重差距,可以把公式调整为1/(r**0.8)或者(101 - r)/100,根据最终词云的展示效果按需调整就行。
注意:示例里的搜索词是西语,分词后要做词形还原,把mesa/mesas、ratona/ratonas这类单复数、阴阳性变体的同语义词合并,不然同一个词的权重会被拆分,展示效果会打折扣。同时要过滤掉de、el这类无意义的通用停用词,别占用有效权重。
2. 分词累加计算每个词的总权重
逐行处理每条搜索数据:
- 先拿到当前条目的排名r,算出这条短语的基础权重
- 对搜索短语分词、过滤停用词、做词形还原
- 把这条短语的基础权重,累加到每个分词的总权重计数上
拿给出的示例数据举个计算例子: - 排名1的短语
mesa ratona moderna基础权重1,三个有效词各累计加1 - 排名2的短语
mesa ratona基础权重0.5,两个有效词各累计加0.5 - 排名3的短语
mesa de arrime过滤掉停用词de,mesa累计加1/3≈0.33,arrime累计加0.33 - 排名4的短语
mesa ratona nordica基础权重0.25,三个有效词各累计加0.25
算完之后mesa总权重是1+0.5+0.33+0.25≈2.08,ratona总权重是1+0.5+0.25=1.75,权重高低和搜索排名完全匹配。
3. 传入预计算权重生成词云
Python的WordCloud库原生支持直接传入预计算好的词权重字典,不需要用它自带的文本词频统计功能,核心代码如下:
from wordcloud import WordCloud import matplotlib.pyplot as plt # 第二步算好的词权重字典,格式为 {分词字符串: 权重数值} word_weights = { "mesa": 2.08, "ratona": 1.75, "moderna": 1, "arrime": 0.33, "nordica": 0.25 # 剩余分词按实际计算结果补全即可 } wc = WordCloud( width=1200, height=800, background_color="white", # 西语内容要配置支持西语特殊字符的字体,避免显示乱码 font_path="path/to/your/spanish_font.ttf" ) # 直接使用权重字典生成词云 wc.generate_from_frequencies(word_weights) plt.imshow(wc) plt.axis("off") plt.show()
可选优化项
- 西语分词、词形还原不用自己写规则,直接加载spaCy的西语预训练模型处理,准确率高很多
- 电商场景可以给Top10的核心热词额外乘1.2~1.5的权重系数,让核心搜索词在词云里更突出
- 停用词表要适配电商搜索场景,别把moderna、nordica这类用户实际关注的属性词当成通用停用词过滤掉
内容的提问来源于stack exchange,提问作者Federico Mosquera
相关产品推荐
相关产品推荐

