词权重 (term weight)方案总结

1 无监督 (unsupervised) 方法

1.1 统计方法(TF, TF-IDF, YAKE)

详情可以参考我之前的博文:TF, TFIDF, YAKE

1.2 图方法 (TextRank, SingleRank, TopicRank, PositionRank)

详情可以参考我之前的博文:TextRank, SingleRank, TopicRank, PositionRank

2 有监督 (supervised ) 统计方法

2.1 Delta TF-IDF

Delta TF-IDF针对文本分类,通过计算单词在正负语料的TF-IDF得分差异来衡量一个词的重要性,核心思想是提高在正负样本之间分布不均匀的词的重要性,分布不均匀的词具有更高的区分度,term t t t在文本 d d d的分值计算如下:
V t , d = T F ( t , d ) × l o g 2 ( ∣ P ∣ P t ) − T F ( t , d ) × l o g 2 ( ∣ N ∣ N t ) V_{t,d} = TF(t, d) \times log_2(\frac{|P|}{P_t}) - TF(t, d) \times log_2(\frac{|N|}{N_t}) Vt,d=TF(t,d)×log2(PtP)TF(t,d)×log2(NtN)
= T F ( t , d ) × l o g 2 ( ∣ P ∣ P t N t ∣ N ∣ ) =TF(t, d) \times log_2(\frac{|P|}{P_t}\frac{N_t}{|N|}) =TF(t,d)×log2(PtPNNt)
其中 T F ( t , d ) TF(t,d) TF(t,d)表示的是 term t t t在文本 d d d的词频率,一般计算公式是用文本包含term t t t的词频除以文本的总词频,得到该词的频率分值, ∣ P ∣ |P| P表示的是正样本文档数量, P t P_t Pt表示的在正样本文档中包含 term t t t的文档数,而 ∣ N ∣ |N| N表示的是负样本文档数量, N t N_t Nt表示的是在负样本文档中包含 term t t t的文档数。

2.2 TF-IDF-ICF

TF-IDF-ICF是在TF-IDF基础上,利用label信息进行有监督的对term进行权重学习,通过增加Inverse Class Frequency (ICF)因子,让那些在少量文本( IDF) 出现以及少量类别 (ICF)出现的term给与更高的权重分值。其中term t t t在文本 d d d中的权重计算公式如下:
V t , d = T F ( t , d ) × I D F ( t ) × ( 1 + l o g ( M C F ( t ) ) ) V_{t,d} = TF(t,d) \times IDF(t) \times (1 + log ( \frac{M}{CF(t)})) Vt,d=TF(t,d)×IDF(t)×(1+log(CF(t)M))

T F ( t , d ) TF(t,d) TF(t,d)表示term t t t在文本 d d d中的词频, I D F ( t ) = l o g 2 ( D D t ) IDF(t)=log_2(\frac{D}{D_t}) IDF(t)=log2(DtD)表示倒文本频率。 M M M表示的是类别的数量, C F ( t ) CF(t) CF(t)表示的是term t t t在所有类别 M M M个中出现的次数。从上面公式可以看出,相比TF-IDF,TF-IDF-ICF对那些在类别中出现较少的词提高了权重,因为该词在所有类别中出现频率较少,则相对更有区分度

2.3 TF-RF

TF-RF (Term Frequency-Relevance Frequency) 和 Delta TF-IDF思想类似,将term在正样本和负样本的分布考虑进去,但是仅仅考虑包含该term的文本,分值计算如下:

V t , d = T F ( t , d ) × l o g 2 ( 2 + P t m a x ( 1 , N t ) ) V_{t,d} = TF(t, d) \times log_2(2 + \frac{P_t}{max(1, N_t)} ) Vt,d=TF(t,d)×log2(2+max(1,Nt)Pt)
其中 P t P_t Pt表示的是包含term t t t的正样本数量, N t N_t Nt表示的是包含term t t t的负样本数量。论文指出,不包含term t t t的文本特别多,将这些文本考虑进来,会影响term t t t在正负样本中的分布情况,所以只用了相对的频率分布,其中公式中常数值起到平滑作用。

2.4 TF-IGM

TF-IGM ( Term Frequency-Inverse Gravity Moment) 用来衡量term在类别之间的不均匀度,进而可以反映term在类别的区分度。首先我们来看下IGM的公式:
I G M ( t ) = ( f t 1 ∑ r = 1 M f t r × r ) IGM(t) = (\frac{f_{t1}}{\sum_{r=1}^Mf_{tr} \times r}) IGM(t)=(r=1Mftr×rft1)
其中 f t r ( r = 1 , 2 , . . . , M ) f_{tr} (r=1,2,...,M) ftr(r=1,2,...,M)表示的是term t t t在第 r r r个类别的文本频率, f t r f_{tr} ftr是降序排列好的,也就是说 f t 1 f_{t1} ft1代表term t t t在该类别中出现的文本频率最高。从IGM的公式可以看出,当term t t t在类别分布越均匀,分母分值越大,则IGM分值越小;而分布越不均匀,则相反,分布越不均匀,说明该term在类别区分度越大。TF-IGM权重分值计算如下:
V t , d = T F ( t , d ) × ( 1 + λ × I G M ( t ) ) V_{t,d} = TF(t,d) \times (1+ \lambda \times IGM(t)) Vt,d=TF(t,d)×(1+λ×IGM(t))
其中 λ \lambda λ是一个可以调整的系数,用来平衡term在全局或者局部分值权重,通常设置值为5到9之间。

2.5 CTF-ICF

CTF-ICF ( Class Term Frequency-Inverse Class Frequency) 主要解决文本较短 (比如在电商场景下的sku title),重要的term有可能在一个文本 (sku) 中出现的词频并不高,用TF不能够很好的衡量term的重要度,所以需要对相同类别的文本聚合为一个大的文本,再计算term的频率,在这里称为CTF,若该term在该类别的所有文本中出现的频率越高,该term对于该类别越重要,CTF分值越大,同时为了衡量term在不同的类别上的区分度,用ICF倒类别频率分值来衡量,具体计算如下:

V t , d i c = C T F ( t ) × I C F ( t ) = ∑ i = 1 k N d i c ( t ) ∑ i = 1 k N d i c × log ⁡ ( M C F ( t ) ) V_{t,d_{i}^c} = CTF(t) \times ICF(t) = \frac{\sum_{i=1}^{k} N_{d_i^c}(t) } {\sum_{i=1}^{k} N_{d_i^c}} \times \log(\frac{M}{CF(t)}) Vt,dic=CTF(t)×ICF(t)=i=1kNdici=1kNdic(t)×log(CF(t)M)
N d i c N_{d_i^c} Ndic表示的是类别为 c c c的第 i i i个文本的所有词频, N d i c ( t ) N_{d_i^c}(t) Ndic(t)表示的是包含term t t t的词频,而 ∑ i = 1 k N d i c ( t ) ∑ i = 1 k N d i c \frac{\sum_{i=1}^{k} N_{d_i^c}(t) } {\sum_{i=1}^{k} N_{d_i^c}} i=1kNdici=1kNdic(t)表示的是term t t t在类别为 c c c的词频率。 M M M表示的总类别数, C F ( t ) CF(t) CF(t)表示包含term t t t的类别数量。(实际应用场景效果还可以,该算法是通过实践过程中改进的)

3 有监督 (supervised ) 语义学习方法

此类方法主要基于语义模型,通过对应的学习任务,让模型学习出每个term的分值。

3.1 基于关键词学习

Keyphrase Extraction Using Deep Recurrent Neural Networks on Twitter,该论文发表在2016年 EMNLP上,本文基于一个2层的RNN模型将关键词和关键短语提取当做一个标注分类任务,判断每个词是否是关键词或者关键短语,对每个term进行一个二分类任务,模型预测的分值可以当做该term的权重。论文中模型的第一层用来做关键词识别任务,第二层用来做关键短语识别任务,最后将两个任务损失函数进行权重融合,作为最终的损失函数:
J ( θ ) = a J 1 ( θ ) + ( 1 − a ) J 2 ( θ ) J(\theta) = aJ_1(\theta) + (1-a)J_2(\theta) J(θ)=aJ1(θ)+(1a)J2(θ)

3.2 基于文本分类

Progress Notes Classification and Keyword Extraction using Attention based Deep Learning Models with BERT, 本论文基于BERT+attention Layer通过对文本进行分类,利用attention层自动学习文本中的每个词的权重,根据词的权重,可以获取与文本主题相关的关键词,下图是截取论文中提供的高attention权重的关键词效果:
在这里插入图片描述

3.3 基于检索语义向量匹配

Learning Term Discrimination,发表在2020 SIGIR会议的short paper上。论文用一个浅层的神经网络去学习term的TDV (term discrimination values)分值,同时基于学到的termTDV分值,在建立倒排索引的时候,除了对一些停用词进行过滤,进一步对TDV分值为0的进行过滤,在没有降低检索质量的同时,检索速度提升了几倍

3.3.1 TF-IDF的相关性分值计算

首先我们来看下query q q q和文本 d d d基于TF-IDF相关性分值计算如下:
T F - I D F ( q , d ) = ∑ t ∈ q t f t d ⋅ i d f t = Q T ⋅ ( S : , d ⊙ I D F ) TF\text{-}IDF(q,d) = \sum_{t \in q}tf_{td} \cdot idf_t = Q^T \cdot (S_{:,d} \odot IDF) TF-IDF(q,d)=tqtftdidft=QT(S:,dIDF)
其中 S ∈ R ∣ V ∣ × ∣ C ∣ S \in R^{|V| \times |C|} SRV×C,里面的每个元素 S t , d S_{t,d} St,d表示的是term t ∈ V t \in V tV在文本 d d d的词频 t f t d tf_{td} tftd S S S的每一列 S : , d S_{:,d} S:,d表示文本 d d d的BoW表征,而每一行 S t , : S_{t,:} St,:表示的是term t t t的倒排列表, Q ∈ N ∣ V ∣ Q \in N^{|V|} QNV表示的是query q q q的BoW表征。 ⊙ \odot 表示的是点元素相乘, I D F ∈ R ∣ V ∣ IDF \in R^{|V|} IDFRV表示的是所有terms 的一个倒文本频率。而idf可以用 L 0 L_0 L0范数从 S S S矩阵求解得到:
i d f t = log ⁡ ∣ C ∣ + 1 d f t = log ⁡ ∣ C ∣ + 1 L 0 ( S t , : ) idf_t = \log \frac{|C|+1}{df_t} = \log\frac{|C|+1}{L_0(S_t,:)} idft=logdftC+1=logL0(St,:)C+1
d f t df_t dft表示包含term t t t的文本频率,但因为 L 0 L_0 L0范数不可导,所以用 L 1 L_1 L1范数替代 L 0 L_0 L0范数( L0范数是指向量中非0的元素的个数),使得可以用梯度下降方法求解,由于 L 1 ( S t , : ) L_1(S_{t,:}) L1(St,:)有可能大于 ∣ C ∣ + 1 |C|+1 C+1,导致IDF分值为负数,所以论文用最大归一化操作,则最终的idf求解得:
i d f t ‾ = log ⁡ m a x { t ′ ∈ V } L 1 ( S t ′ , : ) + 1 L 1 ( S t , : ) \overline{idf_t} = \log \frac{max_{\{t^{'}\in V\}} L_1(S_{t^{'}},:)+1}{{L_1(S_t,:)}} idft=logL1(St,:)max{tV}L1(St,:)+1
所以调整后的TF-IDF计算公式如下:
T F - I D F ( q , d ) ‾ = ∑ t ∈ q t f t d ⋅ i d f t = Q T ⋅ ( S : , d ⊙ I D F ‾ ) \overline{TF\text{-}IDF(q,d)} = \sum_{t \in q}tf_{td} \cdot idf_t = Q^T \cdot (S_{:,d} \odot \overline{IDF}) TF-IDF(q,d)=tqtftdidft=QT(S:,dIDF)
其中 I D F ‾ ∈ R ∣ V ∣ \overline{IDF} \in R^{|V|} IDFRV是一个向量,包含了所有term的 i d f t ‾ \overline{idf_t} idft的值。

3.3.2 基于BM25的相关性分值计算

BM25算法是计算相关性评分的常用一种算法,核心原理是对query Q进行单元解析(一般是分词)得到term,然后计算每个term与文本d的相关性得分,最后将相关性得分进行加权求和,得到query Q与文本d的相关性得分,相关性得分计算如下:
s c o r e ( Q , d ) = ∑ i n w i ⋅ R ( t i , d ) score(Q, d) = \sum_{i}^n w_i \cdot R(t_i, d) score(Q,d)=inwiR(ti,d)
其中 t i t_i ti表示的是query Q Q Q分解后的第 i i i个term, w i w_i wi是对应的权重, R ( t i , d ) R(t_i,d) R(ti,d)表示的是 t i t_i ti与文本 d d d的相关性。一般情况 w i w_i wi分值根据IDF计算,而 t i t_i ti与文本d的相关性得分 R ( t i , d ) R(t_i, d) R(ti,d)计算公式如下:
R ( t i , d ) = d f i ⋅ ( k 1 + 1 ) d f i + K ⋅ q f i ⋅ ( k 2 + 1 ) q f i + k 2 R(t_i, d) = \frac{df_i \cdot (k_1 + 1)}{df_i + K} \cdot \frac{qf_i \cdot (k_2 + 1)}{qf_i + k_2} R(ti,d)=dfi+Kdfi(k1+1)qfi+k2qfi(k2+1)
K = k 1 ⋅ ( 1 − b + b ⋅ d l a v g d l ) K = k_1 \cdot (1-b+b \cdot \frac{dl}{avgdl}) K=k1(1b+bavgdldl)
其中 k 1 , k 2 , b k_1, k_2, b k1,k2,b为调节因子, q f i qf_i qfi d f i df_i dfi分别表示term t i t_i ti在query中的词频和在文本中的词频, d l dl dl表示文本d的长度, a v g d l avgdl avgdl表示所有文档的平均长度。由于多数情况下,一个term在query中只出现一次,所以 q f i = 1 qf_i=1 qfi=1,则上述公式可以化简为:
R ( t i , d ) = d f i ⋅ ( k 1 + 1 ) d f i + K R(t_i, d) = \frac{df_i \cdot (k_1 + 1)}{df_i + K} R(ti,d)=dfi+Kdfi(k1+1)
K = k 1 ⋅ ( 1 − b + b ⋅ d l a v g d l ) K = k_1 \cdot (1-b+b \cdot \frac{dl}{avgdl}) K=k1(1b+bavgdldl)
从上面的公式可以看出,若文本越长,则相关性分值越低,因为文本越长,越可能命中term,而参数 b b b越大,文本长度对相关性影响越大。BM25相关性得分整体公式如下:
s c o r e ( Q , d ) = ∑ i n I D F ( t i ) ⋅ d f i ⋅ ( k 1 + 1 ) d f i + k 1 ⋅ ( 1 − b + b ⋅ d l a v g d l ) score(Q,d) = \sum_{i}^n IDF(t_i)\cdot \frac{df_i \cdot (k_1 + 1)}{df_i + k_1 \cdot (1-b+b \cdot \frac{dl}{avgdl})} score(Q,d)=inIDF(ti)dfi+k1(1b+bavgdldl)dfi(k1+1)

3.3.3 基于浅层神经网络的term TDV分值计算

论文中用一个浅层的神经网络学习term的区分度分值TDV,再对倒排索引矩阵 S S S元素值进行调整,计算公式如下:
S t , d ′ = t f t d ⋅ t d v t = t f t d ⋅ R e L U ( w t T ⋅ w + b ) S_{t,d}^{'} = tf_{td} \cdot tdv_t = tf_{td} \cdot ReLU(w_t^T \cdot w + b) St,d=tftdtdvt=tftdReLU(wtTw+b)
我们基于新的 S t , d ′ S^{'}_{t,d} St,d,可以得到新的 I D F ′ ‾ \overline{IDF^{'}} IDF分值,则最终TDV-TF-IDF(q,d)的计算公式表达如下:
T D V - T F - I D F ( q , d ) = Q T ⋅ ( S : , d ′ ⋅ I D F ′ ) ‾ TDV\text{-}TF\text{-}IDF(q,d) = Q^T \cdot (S^{'}_{:,d} \cdot \overline{IDF^{'})} TDV-TF-IDF(q,d)=QT(S:,dIDF)
而融入TDV分值的BM25算法调整如下:
B M 25 ( q , d ) ‾ = Q T ⋅ I D F ′ ‾ ⊙ ( S : , d ( k 1 + 1 ) ) ( S : , d + k 1 ( 1 − b + b ∣ d ∣ a v g d l ) \overline{BM25(q,d)} = Q^T \cdot \overline{IDF{'}} \odot \frac{(S_{:,d} (k_1 + 1))}{(S_{:,d} + k_1(1-b + b\frac{|d|}{avgdl})} BM25(q,d)=QTIDF(S:,d+k1(1b+bavgdld)(S:,d(k1+1))
其中 ∣ d ∣ = L 1 ( S : , d ) |d| = L_1(S:,d) d=L1(S:,d) a v g d l = ∑ d ∈ C L 1 ( S : , d ) / ∣ C ∣ avgdl = \sum_{d \in C} L_1(S:,d)/ |C| avgdl=dCL1(S:,d)/C

3.3.4 Training

整体模型结构图如下:
在这里插入图片描述
考虑到由于有限的训练样本,其中词向量基于Wikipedia语料进行pre-train学习得到,在fine tune阶段并不进行更新。模型需要学习的参数为神经网络层的权重参数 w w w和偏移项 b b b。论文用pairwise hinge loss作为损失函数
L H i n g e ( f , q , d + , d − ) = m a x ( 0 , 1 − f ( q , d + ) + f ( q , d − ) ) L_{Hinge}(f, q, d^+, d^-) = max(0, 1-f(q,d^+) + f(q, d^-)) LHinge(f,q,d+,d)=max(0,1f(q,d+)+f(q,d))
其中 f f f是一个可微的排序函数(在本论文中比如为TDV-TF-IDF), d + d^+ d+表示与query q q q相关的文本,而 d − d^- d表示不相关的文本。为了获得稀疏解,对TVD分值为0的进行过滤掉,对文本的BoW表征增加了 L 1 L_1 L1范数约束,所以最终的loss表示如下:
( 1 − λ ) L H i n g e ( f , q , d + , d − ) + λ ( L 1 ( S f : , d + ′ ) + L 1 ( S f : , d − ′ ) ) (1-\lambda)L_{Hinge}(f, q, d^+, d^-) + \lambda(L_1(Sf^{'}_{:,d^+})+L_1(Sf^{'}_{:,d^-})) (1λ)LHinge(f,q,d+,d)+λ(L1(Sf:,d+)+L1(Sf:,d))
其中 λ \lambda λ为权重参数,用来平衡hinge loss和L1归一化loss。

3.3.5 试验效果

通过加入TDV分值,不管是TF-IDF还是BM25,整体效果都有较大幅度的提高:
在这里插入图片描述
论文通过对TVD分值为0的进行过滤,所以倒排索引量减少较大:
在这里插入图片描述

  • 5
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在Java中,你可以使用TF-IDFTerm Frequency-Inverse Document Frequency)算法来计算关键权重。下面是一个简单的示例代码,展示了如何使用TF-IDF来统计每个关键权重: ```java import org.apache.commons.text.similarity.CosineSimilarity; import org.apache.commons.text.similarity.TfidfVectorizer; import java.util.Arrays; import java.util.List; import java.util.Map; public class TFIDFExample { public static void main(String[] args) { List<String> documents = Arrays.asList( "This is the first document.", "This document is the second document.", "And this is the third one.", "Is this the first document?" ); // 创建TF-IDF向量化器 TfidfVectorizer tfidfVectorizer = new TfidfVectorizer(); // 使用向量化器来计算TF-IDF权重 Map<String, Double> tfidfWeights = tfidfVectorizer.fitTransform(documents); // 打印每个关键TF-IDF权重 for (Map.Entry<String, Double> entry : tfidfWeights.entrySet()) { System.out.println("Keyword: " + entry.getKey() + ", Weight: " + entry.getValue()); } } } ``` 在这个示例中,我们使用了Apache Commons Text库中的`TfidfVectorizer`类来计算TF-IDF权重。首先,我们创建了一个包含文档的列表。然后,我们实例化了一个`TfidfVectorizer`对象,并使用`fitTransform`方法来计算每个关键TF-IDF权重。最后,我们遍历权重的映射,并打印每个关键权重。 请注意,为了运行这个示例,你需要在你的项目中添加Apache Commons Text库的依赖。你可以通过将以下代码添加到你的`pom.xml`文件中来添加依赖: ```xml <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-text</artifactId> <version>1.9</version> </dependency> ``` 这只是一个简单的示例,你可以根据你的实际需求进行调整和扩展。希望能对你有所帮助!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值