TF-IDF 文本相似度分析
前阵子做了一些IT opreation analysis的research,从产线上取了一些J2EE server运行状态的数据(CPU,Menory...),打算通过训练JVM的数据来建立分类模型,用于server状态的分类。这个过程中发现最难的地方就是构建训练数据集,训练数据必须要有明确的type flag,用以表示数据向量采集当时,server所处的状态类别。简单的说,就是大家不清楚哪些数据代表正常,哪些数据代表异常,哪些数据代表临界状态,甚至不知道server应该有几种明确的状态。出现这样的状况,是因为我们不是产线运维人员,没有相关的经验,对着一坨数据,两眼一抹黑。好在我们有每条数据记录的timestamp,唯一可以于外界联系上的数据,我们就想着通过产线发生Incident的运维信息来大致把产线问题分成若干类,然后根据发生Incident的时间,对应数据的timestamp,从而定义数据的type flag。
因此我们就尝试着从大量的Incident数据中提取出主要的引发Incident的原因。Incident的原因描述是一线运维人员在发现问题和解决问题过程中通过人工填写的文本数据。我们的要做的就是对文本数据进行分类,无监督的分成几个主要的类别,这里面就牵涉到了一个环节:文本相似度计算。
TF-IDF是最基础的文本相似度计算方法。TF(Term Frequency)指一篇文档中单词出现的频率,IDF(Inverse Document Frequency)指语料库中出现某个词的文档数,取对数。
TF = 词在文档中出现的次数 / 文档中所有词的个数
IDF = log(语料库的文档总数 / 语料库中出现某单词的不同文档个数)
TF原理:某个词在一篇文档中出现的频率越多则对这篇文章越重要;
IDF原理:该词在越多的文章中出现,则说明它对文章没有很强的区分度,在文档中所占的权重也就越小,一般采用取词频的逆。还要考虑一个现象,一些通用词出现的次数可能是低频词的几十倍上百倍,如果只是简单的取逆处理,通用词的权重会变动非常小,稀缺词的权重就显得的过大了。为了平衡通用词与稀缺词的权重关系,又对逆采用取对数运算。
TF-IDF算法的优势在于算法简单,并且对文章的所有元素进行了综合考量。但也存在致命的不足,TF-IDF把文章的每个词看做独立的个体进行处理,忽略了词的意义,词之间的关联关系等因素,在这方面Word2Vector的算法就做的很好。
TF-IDF实践步骤,也即是一般的文本处理和模型训练步骤:
1.获取原始文本内容信息。
2.转换成纯小写,按空格把文章分成独立的词组成的list。
3.去除噪音符号: ["\"","=","\\","/",":","-","(",")",",",".","\n"]等
4.去除停用词
5.提取词干,把相近的词转换为标准形式,比如把文章中的go,going,went,goes统一成go
6.wordcount,统计每个词出现的次数,去掉出现次数较少的词,比如在一百篇文档中,只出现了1~2次的词,显然是没有意义的。
7.训练idf模型
8.对输入的每篇测试文章计算其tfidf向量,然后可以利用tfidf向量求文章之间的相似度(比如用欧拉距离,余弦相似度,Jaccard系数等方法)。
代码实现,采用spark MLlib提供的TF-IDF库。
- def splitSeq2Words(notes):
- wordlist = notes.lower().split(" ")
- return wordlist
- def removeNoiseChars(word):
- for char in noiseChars:
- if char in word:
- word = word.replace(char, "")
- return word
- def dataCleanProcessing(content):
- content = splitSeq2Words(content)
- rawWordData1 = map(lambda word:removeNoiseChars(word),content)
- rawWordData2 = filter(lambda word:word != '', rawWordData1)
- rawWordData3 = filter(lambda word:not StopWordSet.__contains__(word),rawWordData2)
- rawWordData4 = filter(lambda word:not OnceWordSet.__contains__(word),rawWordData3)
- return rawWordData4
- summaryContentList = translate_training_sample("./data/trainingSample.xml")
- summaryContentRDD = sc.parallelize(summaryContentList)
- cleanData = summaryContentRDD.map(lambda content:dataCleanProcessing(content))
- cleanData.count()
- cleanData.cache()
- print cleanData.take(10)
- tf = HashingTF(numFeatures = 100)
- tfVectorMatrix = tf.transform(cleanData)
- tfVectorMatrix.cache()
- print tfVectorMatrix.count()
- print tfVectorMatrix.take(10)
- idf = IDF()
- idfModel = idf.fit(tfVectorMatrix)
TF-IDF 文本相似度分析的更多相关文章
- 文本离散表示(三):TF-IDF结合n-gram进行关键词提取和文本相似度分析
这是文本离散表示的第二篇实战文章,要做的是运用TF-IDF算法结合n-gram,求几篇文档的TF-IDF矩阵,然后提取出各篇文档的关键词,并计算各篇文档之间的余弦距离,分析其相似度. TF-IDF与n ...
- 文本相似度分析(基于jieba和gensim)
基础概念 本文在进行文本相似度分析过程分为以下几个部分进行, 文本分词 语料库制作 算法训练 结果预测 分析过程主要用两个包来实现jieba,gensim jieba:主要实现分词过程 gensim: ...
- 【Pyhton 数据分析】通过gensim进行文本相似度分析
环境描述 Python环境:Python 3.6.1 系统版本:windows7 64bit 文件描述 一共有三个文件,分别是:file_01.txt.file_02.txt.file_03.txt ...
- python 用gensim进行文本相似度分析
http://blog.csdn.net/chencheng126/article/details/50070021 参考于这个博主的博文. 原理 1.文本相似度计算的需求始于搜索引擎. 搜索引擎需要 ...
- 基于python语言使用余弦相似性算法进行文本相似度分析
编写此脚本的目的: 本人从事软件测试工作,近两年发现项目成员总会提出一些内容相似的问题,导致开发抱怨.一开始想搜索一下是否有此类工具能支持查重的工作,但并没找到,因此写了这个工具.通过从纸上谈兵到着手 ...
- Python 文本相似度分析
环境 Anaconda3 Python 3.6, Window 64bit 目的 利用 jieba 进行分词,关键词提取 利用gensim下面的corpora,models,similarities ...
- LSTM 句子相似度分析
使用句子中出现单词的Vector加权平均进行文本相似度分析虽然简单,但也有比较明显的缺点:没有考虑词序且词向量区别不明确.如下面两个句子: "北京的首都是中国"与"中国的 ...
- 文本分类学习(三) 特征权重(TF/IDF)和特征提取
上一篇中,主要说的就是词袋模型.回顾一下,在进行文本分类之前,我们需要把待分类文本先用词袋模型进行文本表示.首先是将训练集中的所有单词经过去停用词之后组合成一个词袋,或者叫做字典,实际上一个维度很大的 ...
- 信息检索中的TF/IDF概念与算法的解释
https://blog.csdn.net/class_brick/article/details/79135909 概念 TF-IDF(term frequency–inverse document ...
随机推荐
- WPF ComboBox Binding
public ConnectionViewModel { private readonly CollectionView _phonebookEntries; private string _phon ...
- 使用oracle11g_instant_client来解决在不安装oracle客户端的情况下连接服务端
一.下载instantclient_11_2,可去oracle官网进行下载. 二.解压缩下载的instantclient_11_2,将instantclient_11_2目录拖放到C:\Program ...
- BZOJ3615 : MSS
将所有点按横坐标排序,那么最长上升子序列和最长下降子序列里必有一个长度不小于$\sqrt{n}$. 因为如果最长上升子序列很短,那么根据Dilworth定理,它的反链长度与它成反比. 因此可以将$n$ ...
- BZOJ4624 : 农场种植
设$A[i][j]=[a[i][j]=G],B[i][j]=[b[i][j]=L]$,枚举右下角,则对应$(A-B)^2$的和就是匹配成功的格子数. $(a-b)^2=a^2+b^2-2ab$,将矩阵 ...
- js中eval详解,用Js的eval解析JSON中的注意点
先来说eval的用法,内容比较简单,熟悉的可以跳过eval函数接收一个参数s,如果s不是字符串,则直接返回s.否则执行s语句.如果s语句执行结果是一个值,则返回此值,否则返回undefined. 需要 ...
- 带有hover效果的text-overflow
代码:<!DOCTYPE html> <html> <head> <style> div.test { white-space:nowrap; widt ...
- URAL 1057. Amount of Degrees(数位DP)
题目链接 我看错题了...都是泪啊,不存在3*4^2这种情况...系数必须为1... #include <cstdio> #include <cstring> #include ...
- 编码Q&A
Q:什么是编码? A:由于计算机中所有数据都是以二进制存在,那么为了存储数字,字母,各种符号和文字,计算机必须用一套映射系统来对应.比如我在某台计算机上规定,用00010001这个二进制数表示字母a, ...
- ucgui
消息机制 http://blog.csdn.net/jacklam200/article/details/5919898 font http://blog.csdn.net/jacklam200/ar ...
- flex的http URL转码与解码
private function httpEncoding(param:String):String{ //转码 return encodeURIComponent(param); } ...