词袋与TF-IDF

词袋 (Bag of Words,简称BoW) 是一种统计某个词在一份文档中出现次数的算法。统计所得的词频数据可以用于比较文档并测量其相似性,具体应用包括搜索、文档分类、主题建模等。词袋法是为深度学习网络准备文本输入的方法。

词袋法会列出每个词及其在每份文档中出现的次数。实质上已经向量化的词和文档被存储到表格中,表格的每一行对应一个词,每一列对应一份文档,而每个单元格则是一项词频数。语料库中的每份文档都以长度相等的列来表示。这也就是词频向量,一种脱离了上下文的输出。


deeplearning4j

在输入神经网络之前,每个词频向量都需要进行标准化,确保向量的所有元素之和为1。如此就相当于将每个词的频率转换为该词在文档中出现的概率。超过一定水平的概率会激活网络中的节点,对文档的分类产生影响。


词频-逆文档频率(TF-IDF)

词频-逆文档频率(TF-IDF)是另一种根据文章中包含的词来判断文章主题的方法。TF-IDF为词赋予权重——TF-IDF测量的是相关性,而非频率。因此,在整个数据集中,词频都会被TF-IDF分值所取代。

首先,TF-IDF会测量某一特定文档中的词的出现次数(即词频,term frequency)。但是,由于“and”、“the”之类的词所有文档中都频繁出现,这些词的频率需要调整。这就是逆文档频率的部分。出现某一个词的文档数量越多,这个词作为信号的价值就越小。这样做的目的是仅留下独特的高频词用作标记。每个词的TF-IDF相关性是一种标准化的数据格式,总和也是1。


deeplearning4j

随后,标记词会被当作特征输入神经网络,以确定包含这些词的文档的主题。

词袋的配置方式如下:


public class BagOfWordsVectorizer extends BaseTextVectorizer {
      public BagOfWordsVectorizer(){}
      protected BagOfWordsVectorizer(VocabCache cache,
             TokenizerFactory tokenizerFactory,
             List<String> stopWords,
             int minWordFrequency,
             DocumentIterator docIter,
             SentenceIterator sentenceIterator,
             List
             <String> labels,
             InvertedIndex index,
             int batchSize,
             double sample,
             boolean stem,
             boolean cleanup) {
          super(cache, tokenizerFactory, stopWords, minWordFrequency, docIter, sentenceIterator,
              labels,index,batchSize,sample,stem,cleanup);
    }

TF-IDF虽然原理简单,但功能极其强大,在谷歌搜索等无处不在的实用工具中都有所应用。

词袋法与我们接下来要介绍的 Word2vec有所不同。主要的区别是:Word2vec为每个词生成一个向量,而词袋法则为每个词生成一个数字(词频)。Word2vec很适合对文档进行深入分析,识别文档的内容和内容子集。它的向量表示每个词的上下文,亦即词所在的n-gram。词袋法适合对文档进行总体分类。


Other Deeplearning4j Tutorials

与我们在Gitter聊天