前阵子做了一些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. CF# Educational Codeforces Round 3 C. Load Balancing

    C. Load Balancing time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...

  2. Python: 常用list, string处理功能

    #1. keep strings in double quote as one word when split string to words #e.g. str = ‘a b "is si ...

  3. BZOJ4116 : [Wf2015]Tours

    将边集划分成若干极大不相交集合,满足每个简单环都可以由某些集合相加得到,则答案就是这些集合大小的$\gcd$的约数. 对于一个简单环,上面的边一定不是桥边,而和它在一个集合的边肯定不在其他简单环上.因 ...

  4. Web标准中用于改善Web应用程序性能的各种方法总结

    提起Web应用程序中的性能改善,广大开发者们可能会想到JavaScript与DOM访问等基于各种既存技术的性能改善方法.最近,各种性能改善方法被汇总成为一个Web标准. 本文对Web标准中所包含的各种 ...

  5. RecyclerView android:layout_width="match_parent" 无效

    使用RecyclerView 时,在xml文件中设置宽度match_parent无效. View view = mInflater.from(mContext).inflate(R.layout.it ...

  6. ubuntu13.04下安装jdk7

    参考http://www.neversaydie.cc/ubuntu-install-jdk-in-detailed/ 而来 1.手工从Oralce官网下载jdk-7u25-linux-x64.gz  ...

  7. 【BZOJ】1513: [POI2006]Tet-Tetris 3D

    题意 给\(n(1 \le n \le 20000)\)个立方体\((x, y, z)\),依次落下.求所有立方体落下完了以后最高的高度. 分析 平面求最大值,平面更新最大值. 题解 二维线段树走起, ...

  8. android实现两个页面跳转

    1.实现两个界面之间转换 在安卓当中,最常见的就是按下按钮之后跳转到第二个界面. 关键代码很简单: 这是以bn2按钮为例,当前Activity为MainActivity,跳转到Registration ...

  9. windows与linux之间传输文件

    1.使用SSH Secure Shell Client 百度网盘 下载地址 http://pan.baidu.com/s/1kTmp00J 2.使用pscp 百度网盘地址:http://pan.bai ...

  10. java list 交集 并集 差集 去重复并集

    package com; import java.util.ArrayList;import java.util.Iterator;import java.util.List; public clas ...