假设您正在进行监督学习来训练一个模型,该模型在部署时将文本作为输入并输出标签(例如,主题)或类别概率,那么您可能想要做的是平衡、分层抽样。假设有足够的标记数据,请确保您的最终训练集对于每个类/标签具有均衡数量的文本示例。根据您的情况,您可能需要过度/欠采样或以某种方式处理高度不平衡类的问题(请参阅8 个应对不平衡类的策略)。
使用词袋技术的最简单的 NLP 方法,简单地指示句子中某个词的存在/不存在。因此,每个句子都表示为长度为 n 的向量,其中 n = 数据集中唯一单词的数量。
data_set <- c("the big dog", "the small cat", "the big and fat cow")
words <- strsplit(data_set, split = " ") #tokenize sentences
words
##[[1]]
##[1] "the" "big" "dog"
##
##[[2]]
##[1] "the" "small" "cat"
##
##[[3]]
##[1] "the" "big" "and" "fat" "cow"
vec <- unique(unlist(words)) #vector representation of sentences
##[1] "the" "big" "dog" "small" "cat" "and"
##[7] "fat" "cow"
m <- matrix(nrow = length(data_set), ncol = length(vec))
for (i in 1:length(words)) { #iterate the index of tokenized sentences
vec_rep <- vec %in% words[[i]] #create binary word-feature vector
m[i,] <- vec_rep #update matrix
}
df <- data.frame(m, row.names = NULL)
names(df) <- vec
df
## the big dog small cat and fat cow
##1 TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE
##2 TRUE FALSE FALSE TRUE TRUE FALSE FALSE FALSE
##3 TRUE TRUE FALSE FALSE FALSE TRUE TRUE TRUE
有时您可以通过添加二元组和三元组功能来提高性能。
##given: "the big dog"
##unigrams <- {the, big, dog}
##bigrams <- {the big, big dog}
##trigrams <- {the big dog}
有时通过频率加权单词可以提高性能或计算tf-idf。
根据我的经验,另一种提高性能的方法是自定义语言特征工程,特别是如果数据来自社交媒体源,其中充满了拼写错误、首字母缩略词、俚语和其他单词变体。标准 NLP 方法通常会删除停用词(例如,the、a/an、this/that 等)来自向量表示(因为封闭类,高频词通常无助于区分类/标签边界)。因为向量表示通常是高维的(大约是语料库/数据集中唯一单词的数量),所以降维技术可以提高性能。例如,可以计算一个单词特征在类间的分布上的 chi-sq、信息增益等——只保持这些特征/单词高于某个阈值或低于某个预先确定的 p 值)。