术语频率的相关性度量

数据挖掘 统计数据 特征选择
2021-10-01 15:33:57

我正在尝试编写一个框架来比较一组标签,例如(对于一个问题的 5 个是/否答案的样本) [0, 1, 1, 1, 0]与一系列特征来确定相关性。对于数值非稀疏特征,例如“字数”或“平均字长”,我知道我可以使用方差协方差矩阵并了解“字数”或“平均字长”是否是模型回答问题的信息特征。

我希望能够对术语频率做同样的事情(假设在 scikit-learn 中使用 CountVectorizer),但是生成的协方差矩阵会相当大,并且只会指示该特定术语是否是一个信息性特征。我如何获得某种“崩溃”或“聚合”的相关性度量?这甚至可能吗?

3个回答

如果您对 5 个输出中的每一个进行简单的线性回归,则您的 r 平方将是衡量“总体相关性”的良好指标。如果您想与其他结果进行比较,那么对您的每个单一功能也执行相同的操作会很有帮助。

根据您的描述, Pointwise Mutual Information之类的东西似乎可以满足您的要求。它通常用于文本挖掘和意见分析,以分析特定术语和类别之间的相关程度(例如,产品评论中的术语和“正面评论”类别)。

如果您想要术语频率的相关性,假设您对每一行都有一个频率向量表示,那么您可以通过计算余弦相似度来计算任何两行之间的相似度

以下是如何在 R 中做到这一点:

data_set <- c("the big bad dog", 
              "the small cat and the orange cat", 
              "the big big dog")
words <- strsplit(data_set, split = " ") #tokenize sentences
vec <- unique(unlist(words)) #vector representation of sentences

m <- matrix(nrow = length(data_set), ncol = length(vec))

for (i in 1:length(words)) { #iterate the index of tokenized sentences
  tokens <- words[[i]]
  vec_rep <- as.integer(sapply(vec, function(w){sum( w == tokens)})) #create binary word-feature vector
  m[i,] <- vec_rep #update matrix
}

df <- data.frame(m, row.names = NULL)
names(df) <- vec
df

##  the big bad dog small cat and orange
##1   1   1   1   1     0   0   0      0
##2   2   0   0   0     1   2   1      1
##3   1   2   0   1     0   0   0      0

cosineSimilarity <- function(df, row1, row2){
  x <- as.numeric(df[row1,])
  y <- as.numeric(df[row2,])
  (x %*% y) / (sqrt(x%*%x * y%*%y))
}

cosineSimilarity(df,1,1) #1.00
cosineSimilarity(df,1,2) #0.30
cosineSimilarity(df,1,3) #0.82

如果您已标记训练数据,则可以为每个标签创建一个原型向量表示。然后在未标记数据的分类过程中,您只需计算目标文本和每个原型之间的余弦相似度,然后将标签分配给使相似度得分最大化的原型。