如何获取Universal Sentence Encoder训练词表实现搜索重排序器
Universal Sentence Encoder词表获取与稀有词重排序落地方案
先给你说个最实在的结论:谷歌从来没公开过任何版本Universal Sentence Encoder(USE)训练用的全量原始词表。它的训练语料混了大量非公开网页、对话数据、书籍片段,官方从没发过对应训练集的词频统计、固定词表文件,不用费时间找官方放出来的训练关键词集合。
你要做的稀有词匹配重排序,根本不需要拿到原始训练词表,下面三个方法直接就能落地,完全覆盖需求:
- 从本地加载的USE模型里直接导出内置分词词表
现在常用的两个USE版本(轻量DAN版、高精度Transformer版)底层都是用SentencePiece做子词分词,你从TensorFlow Hub拉到本地跑的模型包本身就带了完整的分词词表,和模型编码时实际用的词表完全一致,没有任何偏差。
操作很简单:加载模型之后找到模型内部的sentencepiece_model_file对应的二进制文件,用SentencePiece库加载这个文件,就能导出全量token列表,还能直接给任意文本做分词,判断某个词是不是模型没见过的未登录词——如果一个人名、专有名词被拆成3个以上没意义的短子词甚至单字符,就说明这个词USE根本学不好语义表征,直接归为你要找的稀有关键词就行,根本不需要对照外部词表。 - 基于自己的业务语料做自定义稀有词表,效果比通用训练词表好得多
你碰到的稀有词匹配问题,很大一部分是你自己场景里的专有名词、特定人名、行业黑话,这类词就算在USE的通用训练词表里有,也大概率因为训练语料里出现次数太少,编码出来的语义向量根本不准。你只要把手里所有待检索文档、历史搜索query做个全量词频统计,把出现次数低于你设的阈值(比如全语料出现不到5次)的名词类内容标记成业务侧稀有词,重排序的时候做精确匹配加权,准确率比用通用训练词表高一大截。 - 重排序的打分规则要和模型分词结果对齐
算稀有词匹配分的时候别只做粗暴的字符串匹配:如果query里的稀有词在召回文档里是连续完整出现的,就给最高的加权分;如果这个稀有词在文档里被拆成零散的子词散在不同位置,说明只是字符碰巧重合,语义根本不相关,别给加权;如果文档里有一大堆query里没有、还被USE拆成碎块的未登录词,可以适当扣分,避免那种完全不相关的文档靠通用语义相似度混到前排。
别用网上第三方整理的所谓USE训练词表,这类东西基本都是爬点公开语料凑出来的,错漏特别多,用来判未登录词误判率高得离谱,直接从你本地跑的模型里导内置词表是最靠谱的。
内容的提问来源于stack exchange,提问作者Pratyush
相关产品推荐
相关产品推荐

