对情感进行分析,对评论数据进行相应的分析。
可以用结巴进行分词,主要是划分各文本之间的关系,进行分词操作。
Dict.txt是指结巴使用的分词,也可以自己定义相应的结巴词典,也可以下载一些好用的词典。
第一个参数:我们的词汇;
第二个参数:词频(即重要的程度);
第三个参数:词性
1)使用jieba进行分词:
#!/usr/bin/env python
# _*_ UTF-8 _*_
import jieba
sentence = "我喜欢东方明珠"
# cut_all=True:为全模式。
# cut_all=FALSE:精准模式。
words = jieba.cut(sentence, cut_all=True)
print(words)
# 全模式分词,用的是循环才能获取相应的结果,如果直接print则显示不成功。
for item in words:
print(item)
print("----------------")
# 精准模式分词。
words2 = jieba.cut(sentence, cut_all=False)
for item in words2:
print(item)
print("----------------")
# 搜索引擎分词:
words3 = jieba.cut_for_search(sentence)
for item in words3:
print(item)
print("----------------"
# 如果没有cut_all参数,则默认为精准模式。
words4 = jieba.cut(sentence)
for item in words4:
print(item)
2)利用jieba判断词性:
#!/usr/bin/env python
# _*_ UTF-8 _*_
import jieba.posseg
sentence = "我喜欢东方明珠"
# 标注词性:
# words不是词性,flag为词性;
words = jieba.posseg.cut(sentence)
for item in words:
print(item.word+"--------"+item.flag)
# 常用词性有哪些?
a:形容词;
b:连词;
d:副词;
e:叹词;
f:方位词;
i:成语;
m:数词;
n:名词;
nr:人名;
ns:地名;
nt:机构团体;
p:介词;
r:代词;
t:时间;
u:助词;
v:动词;
vn:名动词;
w:标点符号;
un:未知词语;
也可以建立自己的词典:
即在dict.txt下构建相应的文件,仿照dict.txt文件,名称可以自己取。
词典的加载需要用到jieba下面的load_userdict()方法:
#!/usr/bin/env python
# _*_ UTF-8 _*_
import jieba.posseg
import jieba
jieba.load_userdict("C:/Users/livan/AppData/Local/Programs/Python/Python36/Lib/site-packages/jieba/dict2.txt")
sentence = "我喜欢飞"
# 词语:
sentence2 = jieba.cut(sentence)
for item in sentence2:
print(item)
# 词性:
sentence3 = jieba.posseg.cut(sentence)
for item in sentence3:
print(item)
此添加添加到内存中,每次运行都会变化。
只有dict.txt是持久化存储。
3)利用jieba更改词频:
#!/usr/bin/env python
# _*_ UTF-8 _*_
import jieba
import jieba.analyse
jieba.load_userdict("C:/Users/livan/AppData/Local/Programs/Python/Python36/Lib/site-packages/jieba/dict2.txt")
sentence = "我喜欢飞飞飞飞飞飞飞飞飞飞飞云计算"
# 更改词频,让某个词语只显示一次:
sentence4 = jieba.cut(sentence)
for item in sentence4:
print(item)
# 让飞只显示一次。
jieba.suggest_freq("飞", True)
sentence5 = jieba.cut(sentence)
for item in sentence5:
print(item)
# 如果“云计算”被切分成云、计算,两个词,那么如何将其合并成一个词,使其显示。
# 增加词语到字典中。
jieba.add_word("云计算")
sentence6 = jieba.cut(sentence)
for item in sentence6:
print(item)
# 提取文本中词频比较高的关键词:
# 可以提取小说中比较火的词语。
sentence7 = "我喜欢东方明珠"
# 参数1为对应的文本,参数2,提取多少个,默认二十个
tag = jieba.analyse.extract_tags(sentence7, 3)
print(tag)
# 怎么样返回词语的位置:
sentence8 = jieba.tokenize(sentence7)
for item in sentence8:
print(item)
# 以搜索引擎的方式返回:
sentence9 = jieba.tokenize(sentence7, mode="search")
for item in sentence9:
print(item)
分析盗墓笔记的词频等:
#!/usr/bin/env python
# _*_ UTF-8 _*_
import jieba
import jieba.analyse
# 分析血尸的词频:
data = open("F:/python_workspace/file/Ѫʬ.txt").read()
# 分析出现频率最高的15个词:
tag = jieba.analyse.extract_tags(data, 15)
print(tag)
有时会出现gbk无法读取的错误,因此需要加上encoding。
#!/usr/bin/env python
# _*_ UTF-8 _*_
import jieba
import jieba.analyse
# 分析血尸的词频:
data = open("F:/python_workspace/file/Ѫʬ.txt", encoding="utf-8").read()
# 分析出现频率最高的15个词:
tag = jieba.analyse.extract_tags(data, 15)
print(tag)
如果这样也报编码错误,则还有以下几个方法:
#!/usr/bin/env python
# _*_ UTF-8 _*_
import jieba
import jieba.analyse
# 分析血尸的词频:
data = open("F:/python_workspace/file/Ѫʬ.txt", "r", encoding="utf-8").read()
# 分析出现频率最高的15个词:
tag = jieba.analyse.extract_tags(data, 15)
print(tag)
# 编码问题的解决方案:
import urllib.request
# 方法1:
data2 = urllib.request.urlopen("http://127.0.0.1/盗墓笔记.html").read().decode()
# 方法2:重新建一个空白文档,然后复制过去。
data = open("F:/python_workspace/file/Ѫʬ.txt", "r", encoding="utf-8")\
"utf-8","ignore")
# 分析出现频率最高的15个词:
tag = jieba.analyse.extract_tags(data, 15)
print(tag)
盘古词库:http://pangusegment.codeplex.com/
其中有较多经典词典。
1、文本相似度分析(一):
如何实现两个文本之间相似度的计算,有可能是多个文件,在搜索引擎中使用此方法。
概念:
()是一种用于资讯检索与资讯探勘的常用加权技术。TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。TF-IDF加权的各种形式常被搜寻引擎应用,作为文件与用户查询之间相关程度的度量或评级。除了TF-IDF以外,因特网上的搜寻引擎还会使用基于连结分析的评级方法,以确定文件在搜寻结果中出现的顺序。
语料库:即从真实的文本中提取出来的一些语言材料。
原理:
在一份给定的文件里,词频 (term frequency,TF)指的是某一个给定的词语在该文件中出现的次数。这个数字通常会被归一化(分子一般小于分母区别于IDF),以防止它偏向长的文件。(同一个词语在长文件里可能会比短文件有更高的词频,而不管该词语重要与否。)
逆向文件频率 (inverse document frequency, IDF)是一个词语普遍重要性的度量。表示包含关键词条i 的文档数量越多,其在区分文档中的作用ԽС――主要用来排除虚词等一些毫无意义的语法词。某一特定词语的IDF,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取对数得到。
某一特定文件内的高词语频率,以及该词语在整个文件集合中的低文件频率,可以产生出高权重的TF-IDF。因此,TF-IDF倾向于过滤掉常见的词语,保留重要的词语。
TFIDF的主要思想是:如果某个词或短语在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。TFIDF实际上是:TF * IDF,TF词频(Term Frequency),IDF反文档频率(Inverse Document Frequency)。TF表示词条在文档d中出现的频率(另一说:TF词频(Term Frequency)ָ的是某一个给定的词语在该文件中出现的次数)。IDF的主要思想是:如果包含词条t的文档越少,也就是n越小,IDF越大,则说明词条t具有很好的类别区分能力。如果某一类文档C中包含词条t的文档数为m,而其它类包含t的文档总数为k,显然所有包含t的文档数n=m+k,当m大的时候,n也大,按照IDF公式得到的IDF的值会小,就说明该词条t类别区分能力不强。(另一说:IDF反文档频率(Inverse Document Frequency)是指果包含词条的文档越少,IDF越大,则说明词条具有很好的类别区分能力。)但是实际上,如果一个词条在一个类的文档中频繁出现,则说明该词条能够很好代表这个类的文本的特征,这样的词条应该给它们赋予较高的权重,并选来作为该类文本的特征词以区别与其它类文档。这就是IDF的不足之处.
在一份给定的文件里,词频(term frequency,TF)指的是某一个给定的词语在该文件中出现的频率。这个数字是对词数(term count)的归一化,以防止它偏向长的文件。(同一个词语在长文件里可能会比短文件有更高的词数,而不管该词语重要与否。)对于在某一特定文件里的词语ti来说,它的重要性可表示为:
ni,j是该词在文件dj中的出现次数,而分母则是在文件中所有字词的出现次数之和。
逆向文件频率(inverse document frequency,IDF)是一个词语普遍重要性的度量。某一特定词语的IDF,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取对数得到:
其中:
示例:
(一)有很多不同的数学公式可以用来计算TF-IDF。这边的例子以上述的数学公式来计算。词频 (TF) 是一词语出现的次数除以该文件的总词语数。假如一篇文件的总词语数是100个,而词语“ĸţ”出现了3次,那么“ĸţ”一词在该文件中的词频就是3/100=0.03。一个计算文件频率 (DF) 的方法是测定有多少份文件出现过“ĸţ”一词,然后除以文件集里包含的文件总数。所以,如果“ĸţ”一词在1,000份文件出现过,而文件总数是10,000,000份的话,其逆向文件频率就是 log(10,000,000 / 1,000)=4。最后的TF-IDF的分数为0.03 * 4=0.12。
(二)根据关键字k1,k2,k3进行搜索结果的相关性就变成TF1*IDF1 +TF2*IDF2 + TF3*IDF3。比如document1的term总量为1000,k1,k2,k3在document1出现的次数是100,200,50。包含了 k1, k2, k3的docuement总量分别是 1000, 10000,5000。document set的总量为10000。 TF1 = 100/1000 = 0.1 TF2 = 200/1000 = 0.2TF3 = 50/1000 = 0.05 IDF1 = log(10000/1000) = log(10) = 2.3 IDF2 =log(10000/100000) = log(1) = 0; IDF3 = log(10000/5000) = log(2) = 0.69 这样关键字k1,k2,k3与docuement1的相关性= 0.1*2.3 + 0.2*0+ 0.05*0.69 = 0.2645 其中k1比k3的比重在document1要大,k2的比重是0.
(三)在某个一共有一千词的网页中“原子能”、“的”和“应用”分别出现了 2 次、35 次和 5 次,那么它们的词频就分别是 0.002、0.035 和 0.005。我们将这三个数相加,其和 0.042 就是相应网页和查询“原子能的应用相关性的一个简单的度量。概括地讲,如果一个查询包含关键词 w1,w2,...,wN, 它们在一篇特定网页中的词频分别是: TF1, TF2, ...,TFN。(TF: term frequency)。那么,这个查询和该网页的相关性就是:TF1 + TF2 + ... + TFN。
读者可能已经发现了又一个漏洞。在上面的例子中,词“的”站了总词频的 80% 以上,而它对确定网页的主题几乎没有用。我们称这种词叫“应删除词”(Stopwords),也就是说在度量相关性是不应考虑它们的频率。在汉语中,应删除词还有“是”、“和”、“中”、“地”、“得”等等几十个。忽略这些应删除词后,上述网页的相似度就变成了0.007,其中“原子能”贡献了 0.002,“应用”贡献了 0.005。细心的读者可能还会发现另一个小的漏洞。在汉语中,“应用”是个很通用的词,而“原子能”是个很专业的词,后者在相关性排名中比前者重要。因此我们需要给汉语中的每一个词给一个权重,这个权重的设定必须满足下面两个条件:
1. 一个词预测主题能力越强,权重就越大,反之,权重就越小。我们在网页中看到“原子能”这个词,或多或少地能了解网页的主题。我们看到“应用”一次,对主题基本上还是一无所知。因此,“原子能“的权重就应该比应用大。
2. 应删除词的权重应该是零。
我们很容易发现,如果一个关键词只在很少的网页中出现,我们通过它就容易锁定搜索目标,它的权重也就应该大。反之如果一个词在大量网页中出现,我们看到它仍然不很清楚要找什么内容,因此它应该小。概括地讲,假定一个关键词w在Dw个网页中出现过,那么Dw越大,w的权重越小,反之亦然。在信息检索中,使用最多的权重是“逆文本频率指数” (Inverse document frequency 缩写为IDF),它的公式为log(D/Dw)其中D是全部网页数。比如,我们假定中文网页数是D=10亿,应删除词“的”在所有的网页中都出现,即Dw=10亿,那么它的IDF=log(10亿/10亿)= log (1) = 0。假如专用词“原子能”在两百万个网页中出现,即Dw=200万,则它的权重IDF=log(500) =6.2。又假定通用词“应用”,出现在五亿个网页中,它的权重IDF = log(2)则只有 0.7。也就只说,在网页中找到一个“原子能”的比配相当于找到九个“应用”的匹配。利用 IDF,上述相关性计算个公式就由词频的简单求和变成了加权求和,即 TF1*IDF1 +TF2*IDF2 +... + TFN*IDFN。在上面的例子中,该网页和“原子能的应用”的相关性为 0.0161,其中“原子能”贡献了 0.0126,而“应用”只贡献了0.0035。这个比例和我们的直觉比较一致了。
简单讲解:
上一章有提到过[基于关键词的空间向量模型]的算法,将用户的喜好以文档描述并转换成向量模型,对商品也是这么处理,然后再通过计算商品文档和用户偏好文档的余弦相似度。
文本相似度计算在信息检索、数据挖掘、机器翻译、文档复制检测等领域有着广泛的应用。
比如舆论控制,我们假设你开发了一个微博网站,并且已经把世界上骂人的句子都已经收录进了数据库,那么当一个用户发微博时会先跟骂人句子的数据库进行比较,如果符合里面的句子就不让用户发出。
通常情况下,很多工程师就会想到用like或者where的sql语法去查找。可是当情况更为复杂呢?
数据库存放了“你是个坏人”,用户要发“小明是个坏人”,这时应该怎么办呢?
最简单的办法就是通过判断文本的相似程度来决定用户发的内容是否是骂人的。
本章节就几种简单的判断文本相似性的算法来讲解,帮助大家更好的理解。
余弦相似性:
余弦(余弦函数),三角函数的一种。在Rt△ABC(直角三角形)中,∠C=90°,角A的余弦是它的邻边比三角形的斜边,即cosA=b/c,也可写为cosA=AC/AB。余弦函数:f(x)=cosx(x∈R)
这是一个非常常见的算法,相信大家都应该学过余弦定理了,简单来说这个算法就是通过计算两个向量的夹角余弦值来评估他们的相似度。
对于二维空间,根据向量点积公式,显然可以得知(ps,这个公式不是这个算法的重点,可以不用强记):
假设向量a、b的坐标分别为(x1,y1)、(x2,y2) 。则:
设向量 A = (A1,A2,...,An),B = (B1,B2,...,Bn) 。推广到多维,数学家已经帮我们证明了,所以你只要记住下面的公式:
简单来说可以写成下面的式子:
(式子中的x和y是指词频)
比如我们要判断两句话
A=你是个坏人 B=小明是个坏人
①先进行分词
A=你 / 是 / 个 / 坏人 B=小明 / 是 / 个 / 坏人
②列出所有的词
{ 你小明是个坏人 }
③计算词频(出现次数)
A={1 0 1 1} (每个数字对应上面的字) B={0 1 1 1}
然后把词频带入公式:
最终=0.667(只余3λ),可以百度"2除以(根号3乘以根号3)"看到计算结果。
余弦值越接近1,就表明夹角越接近0度,也就是两个向量越相似,这就叫"余弦相似性"。
简单来说上面计算出的值代表两个句子大概六成相似,越接近1就越相似。
简单共有词:
通过计算两篇文档共有的词的总字符数除以最长文档字符数来评估他们的相似度。
假设有A、B两句话,先取出这两句话的共同都有的词的字数然后看哪句话更长就除以哪句话的字数。
同样是A、B两句话,共有词的字符长度为4,最长句子长度为6,那么4/6,≈0.667。
编辑距离:
编辑距离(Edit Distance),又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。一般来说,编辑距离越小,两个串的相似度越大。由俄罗斯科学家Vladimir Levenshtein(找不到他照片233333)在1965年提出这个概念。
例如将“BABAY是个好人”转成“BABY是个帅哥”,编辑举例就是2~~(好人变帅哥只要2就好...)~~: BABY是个帅人(好→帅) BABY是个帅哥(人→哥)
然后拿编辑距离去除以两者之间的最大长度,2/6≈0.333,意味着只要变动这么多就可以从A变成B,所以不用变动的字符便代表了相似度,1-0.333=0.667。
SimHash + 汉明距离:
simhash是谷歌发明的算法,据说很nb,可以将一个文档转换成64位的字节,然后我们可以通过判断两个字节的汉明距离就知道是否相似了。
汉明距离是以理查德・卫斯里・汉明的名字命名的。在信息论中,两个等长字符串之间的汉明距离是两个字符串对应位置的不同字符的个数。换句话说,它就是将一个字符串变换成另外一个字符串所需要替换的字符个数。例如:
1011101 与 1001001 之间的汉明距离是 2。
"toned" 与 "roses" 之间的汉明距离是 3。
首先我们来计算SimHash:
①提取文档关键词得到[word,weight]这个一个数组。(举例 [美国,4])
②用hash算法将word转为固定长度的二进制值的字符串[hash(word),weight]。(举例 [100101,4])
③ word的hash从左到右与权重相乘,如果为1则乘以1 ,如果是0则曾以-1。(举例4,-4,-4,4,-4,4)
④接着计算下个数,直到将所有分词得出的词计算完,然后将每个词第三步得出的数组中的每一个值相加。(举例美国和51区,[4,-4,-4,4,-4,4]和[5 -5 5 -5 5 5]得到[9 -9 1 -1 1 9])
⑤对第四步得到的数组中每一个值进行判断,如果>0记为1,如果<0记为0。(举例[101011])
第四步得出的就是这个文档的SimHash。
这样我们就能将两个不同长度的文档转换为同样长度的SimHash值,so,我们现在可以计算第一个文档的值和第二个文档的汉明距离(一般<3就是相似度高的)。
SimHash本质上是局部敏感性的hash(如果是两个相似的句子,那么只会有部分不同),和md5之类的不一样。正因为它的局部敏感性,所以我们可以使用海明距离来衡量SimHash值的相似度。
如果想要小数形式的可以这么做:1 - 汉明距离 / 最长关键词数组长度。
Jaccard相似性系数:
Jaccard 系数,又叫Jaccard相似性系数,用来比较样本集中的相似性和分散性的一个概率。Jaccard系数等于样本集交集与样本集合集的比值,即J = |A∩B| ÷ |A∪B|。
说白了就是交集除以并集,两个文档的共同都有的词除以两个文档所有的词。
欧几里得距离:
欧几里得距离是用得非常广的公式,设A(x1, y1),B(x2, y2)是平面上任意两点那么两点间的距离距离(A,B)=平方根((x1-x2...)^2+(y1-y2....)^2)
我们可以拿两个文档所有的词(不重复)在A文档的词频作为x,在B文档的作为y进行计算。
同样拿A=你是个坏人、B=小明是个坏人这两句话作为例子,词频分别为A={1 0 1 1} 、B={0 1 1 1}。
那么距离为根号2,≈ 1.414(余3位)
然后可以通过1 ÷ (1 + 欧几里德距离)得到相似度。
曼哈顿距离:
曼哈顿距离(Manhattan Distance)是由十九世纪的赫尔曼・闵可夫斯基所创词汇,是种使用在几何度量空间的几何学用语,用以标明两个点上在标准坐标系上的绝对轴距总和。
跟欧几里德距离有点像,简单来说就是d(i,j)=|x1-x2...|+|y1-y2...|,同理xn和yn分别代表两个文档所有的词(不重复)在A和B的词频。
然后可以通过1 ÷ (1 + 曼哈顿距离)得到相似度。
2、稀疏矩阵:
(一)稀疏矩阵的定义
对于那些零元素数目远远多于非零元素数目,而且非零元素的分布没有规律的矩阵称为稀疏矩阵(sparse)。
人们无法给出稀疏矩阵的确切定义,一般都仅仅是凭个人的直觉来理解这个概念,即矩阵中非零元素的个数远远小于矩阵元素的总数,而且非零元素没有分布规律。
(二)稀疏矩阵的压缩存储
因为稀疏矩阵中非零元素较少,零元素较多,因此能够采用仅仅存储非零元素的方法来进行压缩存储。
因为非零元素分布没有不论什么规律,所以在进行压缩存储的时侯须要存储非零元素值的同一时候还要存储非零元素在矩阵中的位置,即非零元素所在的行号和列号,也就是在存储某个元素比方aij的值的同一时候,还须要存储该元素所在的行号i和它的列号j,这样就构成了一个三元组(i,j,aij)的线性表。
三元组能够采用顺序表示方法,也能够采用链式表示方法,这样就产生了对稀疏矩阵的不同压缩存储方式。
、稀疏矩阵的顺序实现
若把稀疏矩阵的三元组线性表按顺序存储结构存储,则称为稀疏矩阵的三元组顺序表。
顺序表中除了存储三元组外,还应该存储矩阵行数、列数和总的非零元素数目,这样才干唯一的确定一个矩阵。
顺序存储结构存储三元组线性表的C#代码例如以下:
代码
行号
列号
元素值
非零元素的最大个数
行数值
列数值
非零元素的实际个数
存储非零元素的值及一个表示矩阵行数、列数和总的非零元素数目的特殊三元组
、稀疏矩阵的十字链表实现
i和j存储的是结点所在的行和列,right和down存储的是指向十字链表中该结点全部行和列的下一个结点的指针,v用于存放元素值。
right和down的域用于在行方向和列方向上指向表结点,next用于指向下一个行或列的表头结点。
i和j存放的是矩阵的行和列数。
十字链表能够看作是由各个行链表和列链表共同搭建起来的一个综合链表,每一个结点aij既是处在第i行链表的一个结点,同一时候也是处在第j列链表上的一个结点,就你是处在十字交叉路口上的一个结点一样,这就是十字链表的由来。
十字链表中的每一行和每一列链表都是一个循环链表,都有一个表头结点。
矩阵运算通常包含矩阵转置、矩阵加、矩阵乘、矩阵求逆等。这里仅讨论最简单的矩阵转置运算算法。
矩阵转置运算是矩阵运算中最重要的一项,它是将m×n的矩阵变成另外一个n×m的矩阵,使原来矩阵中元素的行和列的位置互换而值保持不变,即若矩阵N是矩阵M的转置矩阵,则有:M[i][j]=N[j][i] (0≤i≤m-1,0≤j≤n-1)。
三元组表表示转置矩阵的详细方法是:
第一步:依据M矩阵的行数、列数和非零元总数确定N矩阵的列数、行数和非零元总数。
第二步:当三元组表非空(M矩阵的非零元不为0)时,对M中的每一列col(0≤col≤n-1),通过从头至尾扫描三元组表data,找出全部列号等于col的那些三元组,将它们的行号和列号互换后依次放人N的data中,就可以得到N的按行优先的压缩存贮表示。
密度向量:在给出列或一组列唯一值的比例。统计密度向量的公式:1/列(或一组列)不同值个数。
密度向量用来衡量列的唯一性或列的选择性。密度向量的值在0和1之间。如果这列的密度值为1,表示这列的所有记录值一样,选择性低。更高的密度带来更低的选择性。如果这列的密度值为0.003,表示这列有1/0.003=333个不同值。
我们来看个例子,用下列语句创建表并在上面建立2个索引。
Mllib支持2种局部向量类型:密集向量(dense)和稀疏向量(sparse)。
密集向量由double类型的数组支持,而稀疏向量则由两个平行数组支持。
example:
向量(5.2,0.0,5.5)
密集向量表示:[5.2,0.0,5.5]
稀疏向量表示:(3,[0,2],[5.2,5.5])是向量(5.2,0.0,5.5)的长度,除去0值外,其他两个值的索引和值分别构成了数组[0,2]和数组[5.2,5.5]。
// 创建一个dense vector (5.2, 0.0, 5.5). // 创建一个sparse vector (5.2, 0.0, 5.5)并且指定它的索引和值 // 创建一个sparse vector (5.2, 0.0, 5.5)并且指定它的索引和值,通过指定非0的值,位置0是5.2,位置2是5.5 |
Vector是所有局部向量的基类,Dense-Vector和SparseVector都是Vector的具体实现。
如果一个文件在此文件中出现的高,则可以判断为此词语的类别性区分比较高。
在python中,文本相似度分析封装在gensim库中。
将文档转为稀疏向量(id为xxx的词汇出现了多少次)
语料库:关于语料库的三点基本认识:语料库中存放的是在语言的实际使用中真实出现过的语言材料;语料库是以电子计算机为载体承载语言知识的基础资源;真实语料需要经过加工(分析和处理),才能成为有用的资源。
即从真实的文本中提取出来的一些语言材料。
#!/usr/bin/env python # _*_ UTF-8 _*_ from gensim import corpora, models, similarities import jieba
import urllib.request
# 另一种加载方式: d5 = urllib.request.urlopen("http://127.0.0.1/1_m.html").read().decode("utf-8","ignore") d6 = urllib.request.urlopen("http://127.0.0.1/1_m.html").read().decode("utf-8","ignore")
# 文件相似度的计算:
# 1、读取文档; # 2、对要计算的文档进行分词; # 3、对分次之后的文档进行整理成指定格式,方便后续的计算; # 4、计算出词语的频率; # 5、{可选}对频率低的词语进行过滤; # 6、通过语料库建立词典; # 7、加载要计算对比的文档; # 8、将要对比的文档通过doc2bow转化为稀疏向量; # 9、依据稀疏向量来得到新的语料库; # 10、将新语料库通过tf-idf进行处理,得到一个tf-idf的一个值; # 11、通过token2id得到特征数; # 12、计算稀疏矩阵的相似度,从而建立索引; # 13、得到最终相似度结果; doc1 = "F:/python_workspace/file/盗墓笔记0.TXT" doc2 = "F:/python_workspace/file/盗墓笔记1.TXT" doc3 = "F:/python_workspace/file/盗墓笔记2.txt" doc4 = "F:/python_workspace/file/盗墓笔记3.TXT" d1 = open(doc1).read() d2 = open(doc2).read() data1 = jieba.cut(d1) data2 = jieba.cut(d2) # 词语1 词语2 词语3 ……………… 词语n data11 = "" for item in " " data21 = "" for item in " " # 将两个文档加载在一起: documents = [data11, data21] # 此句什么意思? texts = [[word for word in for document in documents] # 计算频率: frequency = defaultdict(int) for text in for token in 1 去除频率比较小的词语: texts = [[word for word in text if frequency[token]>3for text in texts] dictionary = corpora.Dictionary(texts) dictionary.save("F:/python_workspace/file/wenben2.txt") # 建立要对比的文档: d3 = open(doc3).read() data3 = jieba.cut(d3) data31 = "" for item in " " new_doc = data31 new_vec = dictionary.doc2bow(new_doc.split()) corpus = [dictionary.doc2bow(text) for text in texts] corpora.MmCorpus.serialize("F:/python_workspace/file/d3.mm", corpus) # 将新的语料库进行相应的处理: tfidf = models.TfidfModel(corpus) featureNum = len(dictionary.token2id.keys()) # 建立稀疏矩阵的相似度: index = similarities.SparseMatrixSimilarity(tfidf[corpus], num_features=featureNum) sim = index[tfidf[new_vec]] print(sim)