最后更新于
最后更新于
NLP中有很多常用的, 与单词, 短语, 句子相关的统计量, 在一些任务中, 特别是无监督任务中, 发挥着重要的作用. 此外, 这些统计值也可以作为统计特征, 为神经网络模型补充额外的信息, 如使用Wide & Deep
, Deep cross network
网络等.
这些统计值常常使用在无监督方法进行分词, 新词发现, 领域词发现, Chunking Task等任务中. 经常使用的统计值可以分为以下几类.
衡量流行度没有什么特别的方法, 使用频数即可. 例如使用一个流行度阈值, 过滤掉出现次数达不到阈值的序列, 认为没有分析的意义.
聚合度是衡量词或短语(应对不同任务)内部元素(字/互斥子序列)一致性的指标, 也可以成为凝固度, 凝聚度. 例如"齐天"和"大圣"这两个字序列通常都会一起出现, 因此"齐天大圣"这个词的凝聚度很高. 再如关于影评的语料中, "的电影"和"电影院"出现的频数都很高, 但我们知道"电影院"才是真正的实体, 对应的聚合度应当很高.
如何评价聚合度? 直观上, 假设所有的字(子序列)在语料中是随机出现的, 如果两个子序列如"电影"和"院"真的组不成一个词, 那么两者应当是各自独立地在文本中随机出现, 那么它们连在一起出现的概率就应该约等于两者的概率相乘. 但如果组合在一起出现的概率远大于两者概率相乘, 我们则认为组合在一起出现不是随机的, 而"电影院"应当为一个词.
计算的方法在上面的说明中已经大致说明. 具体来说, 衡量聚合度有以下的统计值.
a, b分别表示两个字/子序列, (a, b)为两者连在一起组成的序列. 表示序列出现的频数. 在计算概率时, 不管n-gram
中的n
为多少, 序列的总数量与unigram
相差数量为, 可以忽略不计, 因此在计算时都使用单字的总数量即可.
对于多于两个字的序列, 将其切分为两个子序列时就有不同的切法. 因此在计算时, 需要遍历所有切分方法, 对所有的方案计算对应的互信息, 然后取其中的最小值作为这个序列的互信息值.
在实际工程中, 对于计算过程中使用到的概率最好取对数之后再存储使用, 主要考虑到:
避免概率过低造成下溢出
将取值范围映射到更平滑的区间中
参考:
这里指的是point-wise Kullback-Leibler divergence. KL散度, 即相对熵, 是描述两个概率分布之间差异的一种方式, 差异越大, KL散度越大, 是一种广义的距离.
而且, 我们认为如果一个短语的一致性比较高, 这个短语的左右两部分应当是紧密联系的, 共现的概率一定要远大于随机组合而拼在一起的概率. 因此, 我们衡量这两个概率分布之间的差值, 就能评价这个候选短语的一致性.
对应的公式如下, 从公式来看, 相当于互信息又乘了一个候选短语出现的概率, 这样减缓了互信息中对低频短语的衡量偏差.