前阵子做了一些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 文本相似度分析的更多相关文章

  1. 文本离散表示(三):TF-IDF结合n-gram进行关键词提取和文本相似度分析

    这是文本离散表示的第二篇实战文章,要做的是运用TF-IDF算法结合n-gram,求几篇文档的TF-IDF矩阵,然后提取出各篇文档的关键词,并计算各篇文档之间的余弦距离,分析其相似度. TF-IDF与n ...

  2. 文本相似度分析(基于jieba和gensim)

    基础概念 本文在进行文本相似度分析过程分为以下几个部分进行, 文本分词 语料库制作 算法训练 结果预测 分析过程主要用两个包来实现jieba,gensim jieba:主要实现分词过程 gensim: ...

  3. 【Pyhton 数据分析】通过gensim进行文本相似度分析

    环境描述 Python环境:Python 3.6.1 系统版本:windows7 64bit 文件描述 一共有三个文件,分别是:file_01.txt.file_02.txt.file_03.txt ...

  4. python 用gensim进行文本相似度分析

    http://blog.csdn.net/chencheng126/article/details/50070021 参考于这个博主的博文. 原理 1.文本相似度计算的需求始于搜索引擎. 搜索引擎需要 ...

  5. 基于python语言使用余弦相似性算法进行文本相似度分析

    编写此脚本的目的: 本人从事软件测试工作,近两年发现项目成员总会提出一些内容相似的问题,导致开发抱怨.一开始想搜索一下是否有此类工具能支持查重的工作,但并没找到,因此写了这个工具.通过从纸上谈兵到着手 ...

  6. Python 文本相似度分析

    环境 Anaconda3 Python 3.6, Window 64bit 目的 利用 jieba 进行分词,关键词提取 利用gensim下面的corpora,models,similarities ...

  7. LSTM 句子相似度分析

    使用句子中出现单词的Vector加权平均进行文本相似度分析虽然简单,但也有比较明显的缺点:没有考虑词序且词向量区别不明确.如下面两个句子: "北京的首都是中国"与"中国的 ...

  8. 文本分类学习(三) 特征权重(TF/IDF)和特征提取

    上一篇中,主要说的就是词袋模型.回顾一下,在进行文本分类之前,我们需要把待分类文本先用词袋模型进行文本表示.首先是将训练集中的所有单词经过去停用词之后组合成一个词袋,或者叫做字典,实际上一个维度很大的 ...

  9. 信息检索中的TF/IDF概念与算法的解释

    https://blog.csdn.net/class_brick/article/details/79135909 概念 TF-IDF(term frequency–inverse document ...

随机推荐

  1. SqlServer事务回滚(2)

    SQL Server 2008中SQL应用系列--目录索引 SQL事务 一.事务概念    事务是一种机制.是一种操作序列,它包含了一组数据库操作命令,这组命令要么全部执行,要么全部不执行.因此事务是 ...

  2. WPF:依赖属性的数据绑定

    One of the strengths of WPF is its data binding capabilities. Although data binding is not new (in f ...

  3. 【原】文本图片自适应高度小bug以及解决办法

    自定义cell的文本图片自适应高度代码,如果存在自定义的cell赋值封装,就必须将自适应高度代码写在这个方法中

  4. [转]七天学会NodeJS

    转:http://nqdeng.github.io/7-days-nodejs/ NodeJS基础 什么是NodeJS JS是脚本语言,脚本语言都需要一个解析器才能运行.对于写在HTML页面里的JS, ...

  5. topcoder SRM 623 DIV2 CatchTheBeatEasy

    比较简单的一题,纠结比较久的是把my_cmp和my_minus放在类中,利用sort函数会出现 no matching function for call to ""sort(st ...

  6. ios cocos2d 画线出现闪烁问题

    根据http://www.merowing.info/2012/04/drawing-smooth-lines-with-cocos2d-ios-inspired-by-paper/ 用cocos2d ...

  7. HTML无刷新提交表单

    通常对于无刷新提交表单,我们都是运用ajax实现的.前段时间跟着老大了解到另一种无刷新提交表单的方法,是利用iframe框架实现的.现在整理出来分享给大家. 第一种: (html页面) <!DO ...

  8. JS:原型

      function Box(){ } //使用字面量的方式创建原型对象,这里{}就是对象,是Object, new Object相当于{} Box.prototype = { name:" ...

  9. Android -- TextView (3)

    1.效果图

  10. HDU-2084 数塔 经典dp,水

    1.HDU-2084   数塔 2.链接:http://acm.hdu.edu.cn/showproblem.php?pid=2084 3.总结:从下往上推,最后归于顶点.方程为  dp[i][j] ...