5 文本表示
离散表示
One-hot
One-hot表示很容易理解。在一个语料库中,给每个字/词编码一个索引,根据索引进行one-hot表示。
John likes to watch movies. Mary likes too.
John also likes to watch football games.
如果只需要表示出上面两句话中的单词,可以只对其中出现过的单词进行索引编码:
{"John": 1, "likes": 2, "to": 3, "watch": 4, "movies": 5, "also":6, "football": 7,
"games": 8, "Mary": 9, "too": 10}
其中的每个单词都可以用one-hot方法表示:
John: [1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
likes: [0, 1, 0, 0, 0, 0, 0, 0, 0, 0]
当语料库非常大时,需要建立一个很大的字典对所有单词进行索引编码。比如100W个单词,每个单词就需要表示成100W维的向量,而且这个向量是很稀疏的,只有一个地方为1其他全为0。还有很重要的一点,这种表示方法无法表达单词与单词之间的相似程度
Bag of Words
词袋表示,也称为计数向量表示(Count Vectors)。文档的向量表示可以直接用单词的向量进行求和得到。
John likes to watch movies also football games Mary too
John likes to watch movies. Mary likes too. -->> [1, 2, 1, 1, 1, 0, 0, 0, 1, 1]
John also likes to watch football games. -->> [1, 1, 1, 1, 0, 1, 1, 1, 0, 0]
横向来看我们把每条文本表示成了一个向量,纵向来看,不同文档中单词的个数又可以构成某个单词的词向量。如上文中的"John"纵向表示成[1,1]。
无序,无语法
功能(1)tf-idf,
(2)文本建模和分类
Bi-gram和N-gram
与词袋模型原理类似,Bi-gram将相邻两个单词编上索引,N-gram将相邻N个单词编上索引。
为 Bi-gram建立索引:
{"John likes”: 1,
"likes to”: 2,
"to watch”: 3,
"watch movies”: 4,
"Mary likes”: 5,
"likes too”: 6,
"John also”: 7,
"also likes”: 8,
"watch football": 9,
"football games": 10}
这样,原来的两句话就可以表示为:
John likes to watch movies. Mary likes too. -->> [1, 1, 1, 1, 1, 1, 0, 0, 0, 0]
John also likes to watch football games. -->> [0, 1, 1, 0, 0, 0, 1, 1, 1, 1]
这种做法的优点是考虑了词的顺序,但是缺点也很明显,就是造成了词向量的急剧膨胀。
TF-IDF
上面的词袋模型和Bi-gram、N-gram模型是基于计数得到的,而TF-IDF则是基于频率统计得到的。TF-IDF的分数代表了词语在当前文档和整个语料库中的相对重要性。TF-IDF 分数由两部分组成:第一部分是词语频率(Term Frequency),第二部分是逆文档频率(Inverse Document Frequency)。其中计算语料库中文档总数除以含有该词语的文档数量,然后再取对数就是逆文档频率。
TF(t)= 该词语在当前文档出现的次数 / 当前文档中词语的总数
IDF(t)= log_e(文档总数 / 出现该词语的文档总数)
根据公式可以看出,TF 判断的是该字/词语是否是当前文档的重要词语,但是如果只用词语出现频率来判断其是否重要可能会出现一个问题,就是有些通用词可能也会出现很多次,如:a、the、at、in等。当然我们对文本进行预处理的时候一般会去掉这些所谓的stopwords,即停用词,但仍然会有很多通用词无法避免地出现在很多文档,而其实它们不是那么重要。
逆文档频率(IDF)用于判断是否在很多文档中都出现了此词语,即很多文档或所有文档中都出现的就是通用词。出现该词语的文档越多,IDF越小,其作用是抑制通用词的重要性。
将上述求出的 TF 和 IDF 相乘记得到词语在当前文档和整个语料库中的相对重要性。TF-IDF与一个词在当前文档中的出现次数成正比,与该词在整个语料库中的出现次数成反比
TF-IDF算法的优点是简单快速,结果比较符合实际情况。缺点是,单纯以"词频"衡量一个词的重要性,不够全面,有时重要的词可能出现次数并不多。而且,这种算法无法体现词的位置信息,出现位置靠前的词与出现位置靠后的词,都被视为重要性相同,这是不正确的。
可以使用sklearn中的TfidfVectorizer生成TF-IDF特征。
共现矩阵 (Cocurrence matrix)
首先解释下“共现”,即共同出现,如一句话中共同出现,或一篇文章中共同出现。这里给共同出现的距离一个规范——窗口,如果窗口宽度是2,那就是在当前词的前后各2个词的范围内共同出现。可以想象,其实是一个总长为5的窗口依次扫过所有文本,同时出现在其中的词就说它们共现。
John likes to watch movies.
John likes to play basketball.
上面两句话设窗口宽度为1,则共现矩阵如下:
可以看到,当前词与自身不存在共现,共现矩阵实际上是对角矩阵。
实际应用中,我们用共现矩阵的一行(列)作为某个词的词向量,其向量维度还是会随着字典大小呈线性增长,而且存储共生矩阵可能需要消耗巨大的内存。一般配合PCA或SVD将其进行降维,如将原来 m×n 的矩阵降为 m×r的矩阵,其中 r<n,即将词向量的长度进行缩减。
下面是奇异值分解的步骤。
分布式表示
word2vec
https://www.jianshu.com/p/471d9bfbd72f
glove
https://blog.csdn.net/linchuhai/article/details/97135612
fastText
https://blog.csdn.net/feilong_csdn/article/details/88655927
elmo