NLP之文本聚类

一 文本聚类简介

1.1、定义

文本聚类主要是依据著名的聚类假设:同类的文档相似度较大,而不同类的文档相似度较小。作为一种无监督的机器学习方法,聚类由于不需要训练过程,以及不需要预先对文档手工标注类别,因此具有一定的灵活性和较高的自动化处理能力,已经成为对文本信息进行有效地组织、摘要和导航的重要手段,为越来越多的研究人员所关注。(摘自百度百科)

1.2、应用领域

文档聚类可以作为多文档自动文摘等自然语言处理应用的预处理步骤
比较典型的例子是哥伦比亚大学开发的多文档文摘系统Newsblaster。Newsblaster将每天发生的重要新闻文本进行聚类处理,并对同主题文档进行冗余消除、信息融合、文本生成等处理,从而生成一篇简明扼要的摘要文档。
对搜索引擎返回的结果进行聚类,使用户迅速定位到所需要的信息
对用户感兴趣的文档(如用户浏览器cache中的网页)聚类,从而发现用户的兴趣模式并用于信息过滤和信息主动推荐等服务
聚类技术还可以用来改善文本分类的结果
数字图书馆服务
通过SOM神经网络等方法,可以将高维空间的文档拓扑保序地映射到二维空间,使得聚类结果可视化和便于理解,如SOMlib[ ]系统;(以上摘自百度百科)
用于大数据中热点话题或事件的发现
与文本分类不同,文本聚类预先并不知道聚出来的每个类别的主题具体是什么,只知道每个类别下的数据相似度较大,描述的是同一个主题。因此,文本聚类比较适合用于大数据中热点话题或事件的发现。

1.3、文本聚类方法

作为NLP领域最经典的使用场景之一,文本聚类形成了它的一般流程(图1)并积累了许多的实现方法。


图1 文本聚类的一般流程图

从图1可以看出,文本聚类主要有一下几个步骤。

  • 分词
  • 去除停用词
  • 构建词袋空间VSM(vector space model)
  • TF-IDF构建词权重
  • 使用聚类算法进行聚类(KMeans,DBSCAN,BIRCH等)

当然,也有在实际应用中考虑到文本向量维度较高不利于聚类等问题,增加pca降维的方法,如图2所示。


图2 文本聚类的一种方法

二 文本聚类的主要步骤

2.1 分词

分词这一步主要是对中文文档而言的,一般使用分词工具来完成。
一般的中文分词工具主要有:jiebaHanlpSnowNLP(MIT)pynlpir(大数据搜索挖掘实验室(北京市海量语言信息处理与云计算应用工程技术研究中心)),thulac(清华大学自然语言处理与社会人文计算实验室) 等。

2.2 去除停用词

所谓停用词就是我们在实际生活中常用的不能用于区分文档之间关系的一些词语。如“的”,“你”,“我”,“他”等。
常见的中文停用词有:
1. 中文停用词表(比较全面,有1208个停用词)
2. 最全中文停用词表整理(1893个)

示例代码:

def read_from_file(file_name):
    with open(file_name,"r") as fp:
        words = fp.read()
    return words

def stop_words(stop_word_file):
    words = read_from_file(stop_word_file)
    result = jieba.cut(words)
    new_words = []
    for r in result:
        new_words.append(r)
    return set(new_words)
def del_stop_words(words,stop_words_set):
#   words是已经切词但是没有去除停用词的文档。
#   返回的会是去除停用词后的剩余词
    result = jieba.cut(words)
    new_words = []
    for r in result:
        if r not in stop_words_set:
            new_words.append(r)
    return new_words

2.3 构建词袋空间VSM(vector space model)

构建词袋空间的步骤如下:

  1. 将所有文档读入到程序中,再将每个文档切词。
  2. 去除每个文档中的停用词。
  3. 统计所有文档的词集合(sk-learn有相关函数)。
  4. 对每个文档,都将构建一个向量,向量的值是对应词语在本文档中出现的次数。

示例代码:

def get_all_vector(file_path,stop_words_set):
names = [ os.path.join(file_path,f) for f in os.listdir(file_path) ]
posts = [ open(name).read() for name in names ]
docs = []
word_set = set()
for post in posts:
    doc = del_stop_words(post,stop_words_set)
    docs.append(doc)
    word_set |= set(doc)
    #print len(doc),len(word_set)

word_set = list(word_set)
docs_vsm = []
#for word in word_set[:30]:
    #print word.encode("utf-8"),
for doc in docs:
    temp_vector = []
    for word in word_set:
        temp_vector.append(doc.count(word) * 1.0)
    #print temp_vector[-30:-1]
    docs_vsm.append(temp_vector)
docs_matrix = np.array(docs_vsm)

2.4 TF-IDF构建词权重

前面已经得到了文本的向量化表示,但是只用词频进行数值化明显是不够的。因此,这里使用TF-IDF来度量每个词的重要程度。
关于TF-IDF的介绍可以参考网上的文章:
1. 基本文本聚类方法
2. TF-IDF百度百科
3. TF-IDF维基百科英文版(需要FQ)

示例代码如下:

column_sum = [ float(len(np.nonzero(docs_matrix[:,i])[0])) for i in range(docs_matrix.shape[1]) ]
column_sum = np.array(column_sum)
column_sum = docs_matrix.shape[0] / column_sum
idf =  np.log(column_sum)
idf =  np.diag(idf)
# 根据IDF的定义,计算词的IDF并不依赖于某个文档,所以我们提前计算好。
# 注意一下计算都是矩阵运算,不是单个变量的运算。
for doc_v in docs_matrix:
    if doc_v.sum() == 0:
        doc_v = doc_v / 1
    else:
        doc_v = doc_v / (doc_v.sum())
    tfidf = np.dot(docs_matrix,idf)
    return names,tfidf

2.5 使用聚类算法进行聚类

到了这一步,就可以使用聚类算法(KMeans,DBSCAN,BIRCH等)进行文本聚类了,在这里就不作详细介绍了。

三 小结

本文主要介绍了NLP中的文本聚类的基本方法。当然,除了使用TF-IDF构建词权重的方法之外,还可以使用LDA主题模型、Word2Vec等获取文本向量表示的方法进行文本聚类,这里就不再一一介绍了。

参考文献
中文文本聚类(切词以及Kmeans聚类)
文本聚类教程

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容