做SEO最耗时间的一件事不是写文章,也不是换友链,是凑关键词。一个产品站几百个SKU,每个要配地区词、品牌词、属性词、用途词,手动拼接能拼到怀疑人生。比如"深圳+二手+iPhone+15+回收",光这一个产品就能组合出几十个搜索变体。
拼关键词这件事,理论上Excel就能做,但实际上到了几百个词根的规模,Excel的运算速度、去重能力、结果可读性都跟不上。所以就有了专门的关键词批量组合工具。
关键词组合的本质:笛卡尔积
把N组词根做排列组合,输出所有可能的搭配结果。比如:
地区词(3个) × 品牌词(5个) × 产品词(8个) × 修饰词(6个) = 720个长尾关键词
工具做的事就是把这个乘法算出来,再加上去重、过滤、排序。
三款工具实测:同样的词根丢进去,出来的结果差在哪
选了三个代表性的工具,用同一组词根测试:地区词(深圳、广州、东莞、佛山、惠州)、服务词(注册公司、代理记账、商标注册、工商变更)、修饰词(多少钱、哪家好、流程、费用、需要什么材料)。理论上输出100个组合(5×4×5)。
| 工具 | 类型 | 生成速度 | 去重 | 导出格式 | 费用 |
|---|---|---|---|---|---|
| 保哥笔记 · 关键词拼接工具 | 在线网页 | 秒出 | ✅ 自动 | TXT复制/下载 | 免费 |
| LZL Tool · 长尾词批量生成器 | 在线网页 | 秒出 | ✅ 自动 | TXT/CSV | 免费 |
| Python自写脚本 | 本地脚本 | 毫秒级 | 自定义规则 | 任意格式 | 免费 |
在线工具的局限性

两个在线工具在100个以内组合时体验很好,秒出结果。但当我测试5000个以上组合时(10列×每列10个词根),LZL Tool开始出现页面卡顿,保哥笔记的处理时间明显变长。量一旦上来,在线工具就会触到浏览器性能的天花板。
在线工具够用吗?大部分场景下够了
先说结论:如果你每次组合的关键词不超过2000个,用在线工具完全够用。保哥笔记和LZL Tool在核心功能上没有本质差别,选哪个看个人习惯:
保哥笔记的优势在于支持自定义分隔符(空格、逗号、下划线等),而且支持选择"两两组合"还是"全部组合",灵活性更高。比如你有5列词根,可以选择只组合其中任意2列或3列,而不是全排列。
LZL Tool的优势是界面更现代化,导出CSV后可以直接在Excel里打开做进一步处理。而且支持"地区+品牌+型号+用途"这种预设模板,电商场景下特别方便。
两个工具都有的短板:
· 不支持智能过滤——会生成"深圳代理记账深圳"这种语义重复的组合
· 不支持指定列的顺序——比如你希望"深圳注册公司"而不是"注册公司深圳",需要手动调整词根列的输入顺序
· 结果不能预览后再筛选——生成完就是一个完整列表,没法在工具内做二次筛选

如果你要处理的关键词超过5000个,上Python
当词根数量上来了——比如你做了100个城市站,每个站要配20个服务词×10个修饰词,总组合量20000个。在线工具撑不住的时候,Python脚本是最灵活的方案。
核心代码其实很简单,itertools.product一行搞定排列组合:
import itertoolsimport csv# 定义词根组cities = ["深圳", "广州", "东莞", "佛山", "惠州", "珠海", "中山", "江门", "肇庆", "汕头"]services = ["注册公司", "代理记账", "商标注册", "工商变更", "注销公司","资质办理", "税务筹划", "地址挂靠", "年检年报", "股权变更"]modifiers = ["多少钱", "哪家好", "流程", "费用", "需要什么材料","价格表", "代办", "电话", "地址", "靠谱吗"]# 笛卡尔积组合combinations = list(itertools.product(cities, services, modifiers))# 拼接 + 去重keywords = list(set(["".join(combo) for combo in combinations]))print(f"共生成 {len(keywords)} 个关键词")# 导出CSVwith open("keywords.csv", "w", newline="", encoding="utf-8-sig") as f:writer = csv.writer(f)writer.writerow(["关键词", "城市", "服务", "修饰词"])for combo in combinations:writer.writerow(["".join(combo), combo[0], combo[1], combo[2]])print("已导出到 keywords.csv")上面这段代码,10个城市 × 10个服务 × 10个修饰词 = 1000个关键词,Python跑完不到0.1秒。20000个关键词也只要1-2秒。
进阶:加上智能过滤,别让垃圾词混进列表
纯排列组合会生成一些语义不通的关键词。比如"广州代理记账深圳"——两个城市词出现在同一个关键词里。加一个过滤规则:
# 过滤规则:一个关键词里不能出现两个城市名def is_valid(keyword):city_count = sum(1 for city in cities if city in keyword)return city_count <= 1# 过滤后输出valid_keywords = [kw for kw in keywords if is_valid(kw)]print(f"过滤前: {len(keywords)} 个, 过滤后: {len(valid_keywords)} 个")还可以加更多过滤规则:关键词长度控制在5-15个字之间、排除包含敏感词的组合、排除纯数字或无意义字符的组合。过滤规则越精细,最终的关键词列表可用的比例越高。
词根从哪来?四个免费来源凑齐你的词根库
工具是帮你拼的,但拼得好不好看词根质量。词根从哪来是比工具选择更前置的问题:

| 来源 | 能挖到什么 | 怎么操作 |
|---|---|---|
| 百度下拉框 | 用户真实搜索的长尾词 | 输入核心词,收集下拉联想词,提取修饰部分 |
| 百度相关搜索 | 搜索结果页底部的相关词 | 搜索核心词后,页面底部8-10个相关词全部采集 |
| 5118 / 站长工具 | 行业词库、竞品词、需求词 | 输入竞品域名,导出其排名关键词,提取高频词根 |
| Google Keyword Planner | 搜索量数据+相关词建议 | 免费但需要广告账号,导出后按搜索量排序取前100 |
词根分类的黄金法则:别超过5列
词根分得太细反而不好。比如"深圳+南山+科技园+注册+公司+代办+费用"这种7列组合,理论上能出上千个词,但实际上大部分都不通顺。控制在3-5列最合理:地区词(1列)、核心业务词(1列)、修饰/需求词(1-2列)、品牌/型号词(1列,可选)。超过5列的组合,可用率通常不到30%。
生成完关键词之后怎么用?三个落地场景
关键词列表不是拿来收藏的,是拿来用的。三个最直接的落地场景:
场景一:批量生成网站页面标题
如果你的网站有城市分站或栏目页,关键词组合直接就是页面标题。比如"深圳注册公司多少钱"这个长尾词,就可以作为一个落地页的核心标题。1000个关键词 = 1000个潜在的搜索入口页面。当然不是说每个都要做一个页面,而是从中挑出搜索意图强、竞争度适中的那些来建内容。
场景二:批量铺设内链锚文本
文章里做内链的时候,锚文本不能全是同一个词。把组合生成的关键词列表作为锚文本库,每篇文章随机选取2-3个变体做内链,锚文本的多样性直接拉满。搜索引擎看到的是"自然的、多样的锚文本分布",而不是"明显刻意优化的重复锚文本"。
场景三:广告账户关键词拓词
做SEM的都知道,广告账户的关键词不是越多越好,但覆盖面一定要全。用组合工具把核心业务词和所有可能的修饰词排列一遍,导入到百度推广或Google Ads的关键词规划师里跑一遍,筛选出有搜索量的词加入账户。这一步能帮你发现很多竞品没覆盖到的低价长尾流量词。
不同规模下的工具选择
| 500个以内 | 保哥笔记或LZL Tool,网页端操作,无需安装,复制粘贴就出结果 |
| 500-5000个 | 在线工具 + Excel辅助。在线工具生成后在Excel里做二次筛选和去重 |
| 5000-50000个 | Python脚本,itertools.product一行搞定,加上自定义过滤规则 |
| 50000个以上 | Python + 数据库。直接写入SQLite或MySQL,边生成边入库,避免内存溢出 |
关键词组合这件事,工具本身没有太多技术含量——本质上就是个排列组合计算器。真正拉开差距的是词根的质量和过滤的精细度。花80%的时间整理词根、设计过滤规则,剩下20%的时间跑工具出结果。顺序反了,出来的就是一堆"看起来很多但没几条能用"的废词列表。
