前阵子做了一些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. python 代码片段20

    #coding=utf-8 # 函数 def foo(x): print x foo(123) # import httplib def check_web_server(host,port,path ...

  2. Mariadb 数据库写入中文乱码问题

    从其他表里面导入数据,出现中文乱码错误.之前操作时并没有碰到类似问题,有些不得其解. 在网上搜了下,最后参考这篇文章,在执行insert前,先执行 set names gbk; 然后成功插入. 链接: ...

  3. glup Browsersync

    http://www.browsersync.cn/#installhttp://www.browsersync.cn/docs/gulp/http://www.mamicode.com/info-d ...

  4. 20145308刘昊阳 《Java程序设计》第6周学习总结

    20145308刘昊阳 <Java程序设计>第6周学习总结 教材学习内容总结 第10章 输入/输出 10.1 InputStream与OutputStream 10.1.1 串流设计概念 ...

  5. Codeforces #Round 376 部分题解

    A: 题目传送门:http://codeforces.com/problemset/problem/731/A 直接根据题意模拟即可 #include "bits/stdc++.h" ...

  6. 【BZOJ】3771: Triple

    http://www.lydsy.com/JudgeOnline/problem.php?id=3771 题意:n个带价值互不相同的物品,每次可以取1.2.3个物品,问能得到的所有的价值和这个价值的方 ...

  7. BZOJ2844: albus就是要第一个出场

    Description 已知一个长度为n的正整数序列A(下标从1开始), 令 S = { x | 1 <= x <= n }, S 的幂集2^S定义为S 所有子集构成的集合. 定义映射 f ...

  8. WZJ的blog开通了

    WZJ的blog开通了

  9. reason: '*** Collection <__NSCFArray: 0x7ffa43528f70> was mutated while being enumerated.'

    一,错误分析 1.崩溃代码如下: //遍历当前数组,判断是否有相同的元素 for (NSString *str in self.searchHistoryArrM) { if ([str isEqua ...

  10. PHP面向对象学习四 类的关键字

    1.关键字:final 用来定义类和方法的一个重要关键字,当定义类的时候该类将不能被继承, 当用来定义方法的时候该方法将不能被重载 2.关键字:static 用来定义类的静态属性或方法,可以在类未被实 ...