TextRepresentation对于自然语言处理的各种应用,最基本的任务就是文本表示。文本不能直接作为模型的输入,必须先转换成矢量形式再导入到模型中进行训练。所谓文本表示,就是研究如何用向量或矩阵的形式来表示文本。文本表示的最小单位是单词,其次是短语、句子和段落。我们需要知道如何以向量的形式表示这些。其中,词的表示是最基本的。对于句子或较长的文本,向量表示取决于单词的表示。词可以有多种表达方式,如one-hotencoding、词向量表法、动态词向量表示法等。单词的表示使用One-hotencoding来表示单词向量。首先,我们需要建立自己的基于文本的词库。同义词库的大小决定了向量矩阵的大小。每个词都有自己独特的向量表示。每个向量只有一个位置表示为1,其余全为0,比如word库的大小为5,某一个词向量可以表示为\([0,0,1,0,0]\).同义词库中包含的单词顺序不影响后续任务。one-hotencoding虽然简单,但也存在很多问题:由于大量0的存在,极其稀疏,每个词用|V|的长度表示,|V|是词典的大小,无法比较语义相似度。句子的表示知道词表示可以知道句子的表示,一个句子是由多个词组成的。记录单词是否出现在句子中,我们可以表示句子的向量,当然有时候也需要记录单词出现的次数。但是这种表示也存在一些问题,例如:不考虑单词重要性,不记录单词出现次数的表示称为布尔函数,而记录出现次数的表示ofwords被称为Countvectorizerfromsklearn.feature_extraction.textimportCountVectorizer#corpuscorpuscorpus=['我喜欢这个课程,','我喜欢这个游戏,','我喜欢这个课程,但我也喜欢那个游戏']#构建countvectorizerobjectvectorizer=CountVectorizer()#获取每个文档的计数向量,X为稀疏矩阵X=vectorizer.fit_transform(corpus)#printdictionaryprint(vectorizer.get_feature_names())#['also','but','course','game','like','that','this']#打印每个文档的向量print(X.toarray())[[0010101][0001101][1111211]]打印(X)(0,4)1(0,6)1(0,2)1(1,4)1(1,6)1(1,3)1(2,4)2(2,6)1(2,2)1(2,3)1(2,1)1(2,0)1(2,5)1文档中表示TF-IDFTF-IDF的意思是考虑词的权重,也有可能我们认为是质量。但也不是说出现的越多越重要,也不是出现的越少越不重要。具体记法请参考以下公式(1):$$tfidf(w)=tf(d,w)*idf(w)\tag{1}$$\(w\)表示一个词,\(tf(d,w)\)表示文档中\(w\)的词频\(d\),\(idf(w)=log\frac{N}{N(w)}\),\(N\)表示语料库中的文档总数,\(N(w)\)表示单词\(w\)在多少文档中出现。TF-IDF的应用非常广泛,是其中的一种即使在您面前也能呈现文本的核心技术。TF-IDF是文本表示领域最有效的基准。文本相似度两个文本之间的相似度可以认为是计算两个向量之间的相似度。下面涉及的相似度计算公式适用于任何矢量化场景,不局限于文本之间的相似度。两种常见的相似度计算方法是基于欧氏距离的计算和基于余弦相似度的计算。计算欧氏距离$$d=|s_1-s_2|\tag{2}$$向量之间的相似度其实需要考虑到向量的方向,因为向量最重要的特征就是它的方向性。如果两个向量相似,那么它们的方向也需要相似。但是计算欧氏距离的过程没有考虑方向,这是欧氏距离最大的问题。计算余弦相似度通过余弦相似度,我们实际上是在计算两个向量之间的夹角。两个向量的方向越一致,它们之间的相似度就越高。$$d=\frac{s_1\cdots_2}{|s_1|*|s_2|}\tag{3}$$\(s_1\cdots_2\)为向量内积,\(|s_1|\)表示长度关于余弦相似度:分母除以向量大小是为了消除影响两个向量的大小。内积可以用来计算向量之间的相似度。余弦相似度考虑了方向,而欧几里得距离不在向量之间。在相似度计算方面,余弦相似度的应用比欧式距离更广泛#计算句子余弦相似度'''向量a,b'''defcos_sim(a,b):dot_product=sum([i[0]*i[1]foriinzip(a,b)])norm_a=np.sqrt(sum([x*xforxina]))norm_b=np.sqrt(sum([y*yforyinb]))returndot_product/(norm_a*norm_b)Summary对于one-hot编码表示的词,基于欧式距离计算的相似度结果为\(\sqrt2\),和基于余弦计算的相似度结果都是0,所以词向量意味着我们需要考虑其他方式。待续...
