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

下面是奇异值分解的步骤。


分布式表示

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

https://zhuanlan.zhihu.com/p/51679783

你可能感兴趣的:(5 文本表示)