NLP入门学习(一)——jieba

1.基本分词函数与用法

jieba.cut 以及 jieba.cut_for_search 返回的结构都是一个可迭代的 generator,可以使用 for 循环来获得分词后得到的每一个词语(unicode)

jieba.cut 方法接受三个输入参数:

  • 需要分词的字符串
  • cut_all 参数用来控制是否采用全模式
  • HMM 参数用来控制是否使用 HMM 模型
import jieba

seg_list = jieba.cut("我在学习自然语言处理", cut_all=True)
print(seg_list)
print("全模式: " + "/ ".join(seg_list))  # 全模式

seg_list = jieba.cut("我在学习自然语言处理", cut_all=False)
print("精确模式: " + "/ ".join(seg_list))  # 精确模式

seg_list = jieba.cut("他毕业于上海交通大学,在百度深度学习研究院进行研究")  # 默认是精确模式
print(", ".join(seg_list))

结果:


jieba.cut_for_search 方法接受两个参数

  • 需要分词的字符串
  • 是否使用 HMM 模型。

该方法适合用于搜索引擎构建倒排索引的分词,粒度比较细


import jieba
seg_list = jieba.cut_for_search("他毕业于上海交通大学,在百度深度学习研究院进行研究")  # 搜索引擎模式
print(", ".join(seg_list))

结果:


2.关键词提取

基于 TF-IDF 算法的关键词抽取(后面附录讲解TF-IDF算法)

import jieba.analyse

  • jieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=())
    • sentence 为待提取的文本
    • topK 为返回几个 TF/IDF 权重最大的关键词,默认值为 20
    • withWeight 为是否一并返回关键词权重值,默认值为 False
    • allowPOS 仅包括指定词性的词,默认值为空,即不筛选
import jieba.analyse as analyse

lines = open('NBA.txt', 'rb').read()
print ("  ".join(analyse.extract_tags(lines, topK=20,
                                      withWeight=False, allowPOS=()))+'\n'+'\n')
lines = open(u'西游记.txt', 'rb').read()
print ("  ".join(analyse.extract_tags(lines, topK=20,
                                      withWeight=False, allowPOS=()))+'\n')

结果:

韦少  杜兰特  全明星  全明星赛  MVP  威少  正赛  科尔  投篮  勇士  球员  斯布鲁克  更衣柜  NBA  三连庄  张卫平  西部  指导  雷霆  明星队

行者  八戒  师父  三藏  唐僧  大圣  沙僧  妖精  菩萨  和尚  那怪  那里  长老  呆子  徒弟  怎么  不知  老孙  国王  一个

TF-IDF算法(1)—算法概述

 参考博客地址:https://www.cnblogs.com/ybjourney/p/4793370.html

  假设现在有一篇很长的文章,要从中提取出它的关键字,完全不人工干预,那么怎么做到呢?又有如如何判断两篇文章的相似性的这类问题,这是在数据挖掘,信息检索中经常遇到的问题,然而TF-IDF算法就可以解决。这两天因为要用到这个算法,就先学习了解一下。

 TF-IDF概述   

    在接触一个新算法时,首先当然是先去了解这个算法的本质,在此,我们先引用百度百科上的解释:TF-IDF(term frequency–inverse document frequency)是一种用于信息检索与数据挖掘的常用加权技术。用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。主要思想是:如果某个词或短语在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类,也就可以作为上文中所提到的关键字。

    这样我们大概就对这个算法有了一些了解,至少知道了它是通过加权来判定字词对于文章的重要性的,那么算法是如何实现的呢?下来我们一步步进行学习:

词频(TF)和逆文档频率IDF

  首先,就算法的命名说起,当然你会好奇这里的TF是什么,IDF是什么。现在回到之前我们提到的问题,要在一篇很长的文章中寻找关键字(词),就一般的理解,如果一个词对于文章而言很关键的话那出现的次数就比较多,于是我们就采用“词频”(Term Freqency)进行统计,这里的词频就是TF。

  那么你肯定会说像“的”、“是”、“了”这类词的出现次数应该是最多的了,它们叫做停用词,对找到结果完全毫无帮助,是我们必须要过滤掉的词,

  假设我们现在过滤掉了所有的那些词,那么又会遇到一个问题,假定我们现在要在一个关于聚类的文章中找寻关键字。我们可能发现“聚类”和“算法”的出现次数一样多,那么它们的重要性就是一样的么?答案当然是否定的,相对于“聚类”而言,“算法”更为常见,出现次数同样多,我们就有理由认为“聚类”的重要程度要大于“算法”。也可以这样理解,如果某个词比较少见,但是它在这篇文章中多次出现,那它很可能就能反映本篇文章的特性,也就可以作为我们所要寻找的关键词。

  联系到层次分析法这类算法的思想,可以赋予每个词特定的权重,像那类最常见的词赋予很小的权重,相应的较少见的词赋予较大的权重,这个权重在这里叫做“逆文档频率”(Inverse Doucument Frequency,缩写为IDF),它的大小与一个词的常见程度成反比。而TF-IDF值就是将词频TF和逆文档频率IDF相乘,值越大,该词对文章的重要性越高。

 步骤

(1)计算词频

  词频 = 某个词在文章中出现的总次数

当然为了消除不同文章大小之间的差异,便于不同文章之间的比较,我们在此标准化词频:

  词频 = 某个词在文章中出现的总次数/文章的总词数

或者:词频 = 某个词在文章中出现的总次数/文章中出现次数最多的词的个数 

(2)计算逆文档频率

在此,首先需要一个语料库来模拟语言的使用环境。

逆文档频率(IDF) = log(词料库的文档总数/包含该词的文档数+1)

为了避免分母为0,所以在分母上加1.

(3)计算TF-IDF值

基于之前的分析了解,有:TF-IDF值 = TF * IDF。

在此有:TF-IDF值与该词的出现频率成正比,与在整个语料库中的出现次数成反比,符合之前的分析。

(4)求出关键字

计算出文章中每个词的TF-IDF值之后,进行排序,选取其中值最高的几个作为关键字。

(5)计算文章的相似性

    计算出每篇文章的关键词,从中各选取相同个数的关键词,合并成一个集合,计算每篇文章对于这个集合中的词的词频,生成两篇文章各自的词频向量,进而通过欧氏距离或余弦距离求出两个向量的余弦相似度,值越大就表示越相似。

优缺点

 1.优点是算法的容易理解,便于实现。

 2.缺点:IDF的简单结构并不能有效地反映单词的重要程度和特征词的分布情况,使其无法很好的完成对权值的调整功能,所以在一定程度上该算法的精度并不是很高。除此之外,算法也没哟体现位置信息,对于出现在文章不同位置的词语都是一视同仁的,而我们知道,在文章首尾的词语势必重要性要相对高点。据此,我们可以或许也可以将处于文章不同位置的词语赋予不同的权重。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值