查询理解基础:查询的构成、多样性与核心任务
大家好,我是你们的讲师。今天咱们聊聊查询理解的基础。说白了,就是搞清楚用户到底在搜什么。
我刚开始做搜索系统时,总觉得用户输入个关键词,我匹配一下不就完了?后来被现实狠狠教育了一顿。用户不是机器,他们输入的东西五花八门,你得先理解“查询”本身是什么。
一、查询(Query)的构成
一个查询,本质上是一串文本。但别小看它,里面藏着不少信息。
我个人习惯把查询拆成三部分:
- 核心词:用户真正想找的东西。比如“苹果手机”里的“手机”。
- 修饰词:限定条件。比如“红色”、“2023款”、“二手”。
- 意图词:用户想干嘛。比如“怎么修”、“价格”、“评测”。
举个例子,“2023款红色苹果手机价格”。核心词是“苹果手机”,修饰词是“2023款”、“红色”,意图词是“价格”。
重点:不是所有查询都包含这三部分。很多查询只有核心词,比如“天气”。这时候就需要靠上下文或用户画像来补全。
我在项目中遇到过一种情况:用户只输入“北京”。这到底是查北京天气、北京旅游、还是北京地图?嗯,这里就要结合用户的历史行为来判断了。
二、查询的多样性
用户不是按教科书说话的。查询的多样性,是每个NLP工程师的噩梦,也是乐趣所在。
1. 长尾查询
长尾查询,就是那些低频、但非常具体的查询。比如“2023年北京海淀区哪家火锅店有包间且能带宠物”。
这种查询,搜索引擎的索引里可能根本没有完全匹配的结果。怎么办?
- 分词与实体识别:把“北京”、“海淀区”、“火锅店”、“包间”、“宠物”拆出来。
- 意图分类:判断用户是想找餐厅,而不是买宠物。
- 语义匹配:用向量化技术找到语义相近的结果。
我的经验:长尾查询虽然量小,但加起来占了总查询量的很大比例。忽略它们,用户体验会差很多。我曾经在一个电商项目中,专门优化了长尾查询的召回,转化率提升了12%。
2. 歧义查询
歧义,是查询理解里最头疼的问题。同一个词,在不同语境下意思完全不同。
| 查询 | 可能含义1 | 可能含义2 |
|---|---|---|
| 苹果 | 水果 | 苹果公司/产品 |
| Java | 编程语言 | 印尼岛屿 |
| 小米 | 手机品牌 | 谷物 |
为什么会这样?因为语言本身就有多义性。你想想看,用户说“我想买苹果”,你给他推荐水果还是手机?
我建议的做法是:
- 上下文消歧:看用户之前搜过什么。如果刚搜过“华为”,那“苹果”大概率是手机。
- 统计消歧:看哪个含义在当前场景下更常见。比如在电商平台,“苹果”作为手机品牌的概率远高于水果。
- 交互式消歧:实在分不清,就反问用户。比如“您是想找水果还是手机?”
避坑指南:我曾经犯过一个错误,把所有“苹果”都当成水果处理。结果用户搜“苹果手机”时,出来一堆水果。嗯,那段时间被投诉得挺惨。
3. 口语化查询
用户不会像写作文一样输入查询。他们更习惯口语化表达。
比如:
- “附近有啥好吃的” → 标准表达是“附近餐厅推荐”
- “这手机咋样” → 标准表达是“手机评测”
- “怎么去天安门” → 标准表达是“天安门交通路线”
口语化查询的特点:
- 省略主语:比如“咋样”,默认指当前浏览的商品。
- 使用语气词:比如“嘛”、“呗”、“啦”。
- 语法不规范:比如“我手机坏了修哪里”。
处理口语化查询,我常用的方法:
- 归一化:把口语词映射到标准词。比如“咋样” → “怎么样” → “评测”。
- 补全:根据上下文补全省略的部分。
- 纠错:修正明显的语法错误或错别字。
小技巧:你可以建一个口语化查询的映射表。比如“好吃” → “美食”、“咋样” → “评价”。这个表需要持续更新,因为用户的口语也在变。
三、查询理解的核心任务
说了这么多,查询理解到底要干什么?说白了,就是三个核心任务。
1. 查询分类
判断用户查询属于哪个类别。比如:
- 导航类:用户想找某个特定网站或页面。比如“百度”、“淘宝”。
- 信息类:用户想获取信息。比如“北京天气”、“Python教程”。
- 交易类:用户想买东西。比如“买手机”、“订酒店”。
分类方法:
- 规则匹配:用关键词或正则表达式。简单粗暴,但有效。
- 机器学习:用分类模型,比如朴素贝叶斯、SVM、深度学习。
- 混合方法:规则兜底,模型做精细分类。
2. 实体识别
从查询中抽取出有意义的实体。比如:
- “2023年北京海淀区火锅店” → 时间:“2023年”,地点:“北京海淀区”,品类:“火锅店”。
- “周杰伦的演唱会门票” → 人物:“周杰伦”,活动:“演唱会”,商品:“门票”。
实体识别常用技术:
- 基于词典:建一个实体词典,匹配查询中的词。
- 基于模型:用BERT、CRF等模型做序列标注。
- 基于规则:比如“XX的XX”结构,前面是实体,后面是属性。
注意:实体识别不是万能的。有些查询没有明确实体,比如“怎么办”。这时候需要结合意图分类来处理。
3. 意图识别
这是查询理解的核心中的核心。用户到底想干嘛?
比如:
- “怎么修手机” → 意图是“维修教程”
- “手机维修价格” → 意图是“价格查询”
- “附近手机维修店” → 意图是“找店铺”
意图识别的方法:
- 基于规则:定义意图模板。比如“怎么+动词” → 教程类意图。
- 基于分类:训练一个意图分类模型。输入是查询文本,输出是意图标签。
- 基于序列:用序列模型(如LSTM、Transformer)捕捉查询中的意图线索。
我个人的经验是,意图识别不能只靠模型。规则和模型结合,效果最好。规则处理高频、明确的意图,模型处理模糊、复杂的意图。
避坑指南:我曾经在一个项目中,把所有意图都交给模型处理。结果模型把“我想买手机”识别成了“我想了解手机”。嗯,用户下单时发现跳到了介绍页面,体验很差。后来我加了一条规则:包含“买”、“下单”、“购买”等词的查询,直接归为交易意图。
总结
查询理解,说白了就是三件事:搞清楚用户说了什么(构成)、用户可能怎么说(多样性)、用户到底想干嘛(核心任务)。
你想想看,如果连用户想干嘛都搞不清楚,后面的搜索、推荐、对话系统,全都是白搭。
下一章,我会带大家深入查询分类的实战。咱们用代码说话。
公众号:蓝海资料掘金营,微信deep3321