对比双语料库识别差异化复合短语的实现方案咨询
跨语料任意长度复合短语识别方案
核心思路
将两个筛选条件拆分为独立的得分模块,两个模块均无需依赖递归子短语存在即可适配任意n≥2的短语:
- 语料内凝固度:衡量短语出现频率远高于各组成成分单独出现的频率
- 跨语料特异度:衡量短语在语料1的出现频率远高于语料2
具体实现步骤
1. 基础统计预处理
先提取两个语料所有的token级信息:
- 统计语料1(C1)、语料2(C2)的总token数
len_C1、len_C2 - 统计所有单token在C1的出现频次
- 统计所有连续n元组(n≥2)分别在C1、C2的出现频次,n的上限可根据业务需求设置(比如最长10元组)
2. 凝固度计算(适配任意n)
采用**归一化广义互信息(NPMI)**作为凝固度指标,无需依赖子短语合并逻辑,直接对任意长度的短语计算:
# P(phrase)为短语在C1的出现概率,P(wi)为短语第i个组成token在C1的出现概率 PMI = log( P(phrase) / (P(w1) * P(w2) * ... * P(wn)) ) NPMI = PMI / (-log(P(phrase)))
NPMI的取值范围固定为[-1,1],得分越高说明短语凝固性越强,可统一设置阈值(比如≥0.6)过滤非固定搭配的短语,不需要随n调整阈值。
3. 特异度计算(解决跨语料零频问题)
采用平滑后的对数频率比作为特异度指标,避免子短语不存在、短语在其中一个语料零频导致的计算错误:
# α为平滑系数,取1e-8即可,避免除零或log(0)问题 c1_norm = (count_C1(phrase) + α) / len_C1 c2_norm = (count_C2(phrase) + α) / len_C2 specificity = log(c1_norm / c2_norm)
specificity得分越高说明短语在C1的相对出现频率越高,可设置阈值(比如≥2,对应C1归一化频率是C2的7倍以上)过滤非C1独有短语。
4. 结果输出
同时满足凝固度阈值、特异度阈值的短语即为目标复合短语,可选补充后处理:如果存在重叠的有效短语(比如“纽约”和“纽约市”均符合要求),可保留最长有效短语即可。
以给出的示例验证:C1中
new york的NPMI得分远高于随机搭配,符合凝固度要求;当C2是洛杉矶相关语料时,new york的特异度得分很高,会被保留;当C2中大量出现new york时,特异度得分低于阈值,会被过滤,完全匹配需求。
相关参考方法
- 凝固度计算参考通用互信息拓展方案,无需递归合并子短语,即可直接计算任意长度短语的搭配合理性
- 跨语料频率对比参考对数似然比修正方案,平滑后可适配零频、语料规模差异大的场景
内容的提问来源于stack exchange,提问作者MRicci
相关产品推荐
相关产品推荐

