jieba textrank关键词提取 python_NLP笔记之正则表达式与jieba分词

本文介绍自然语言处理的基础操作,主要为正则表达式和jieba分词,整理来自B站https://www.bilibili.com/video/BV1is411E7vR?from=search&seid=17199998704756408851

正则表达式

3a110d9f1e683029cd1f61e5e720a3d5.png

97f8946c641ae3ce754d25a7bc988fad.png

c65abbf0228697b9e5b2e6a3403e6f26.png

2cc963a48d317e7d63d1c2d51517a6c0.png

Python re库有正则表达式

# encoding: UTF-8

import re

# 将正则表达式编译成Pattern对象,写到r引号里面

pattern = re.compile(r'hello.*\!')

# 使用Pattern匹配文本,获得匹配结果,无法匹配时将返回None

match = pattern.match('hello, hanxiaoyang!How are you?')

if match:

    #使用Match获得分组信息

   print match.group()

match属性:

string: 匹配时使用的文本。

re: 匹配时使用的Pattern对象。

pos:文本中正则表达式开始搜索的索引。值与Pattern.match()和Pattern.seach()方法的同名参数相同。

endpos:文本中正则表达式结束搜索的索引。值与Pattern.match()和Pattern.seach()方法的同名参数相同。

lastindex: 最后一个被捕获的分组在文本中的索引。如果没有被捕获的分组,将为None。

lastgroup:最后一个被捕获的分组的别名。如果这个分组没有别名或者没有被捕获的分组,将为None。

split(string[, maxsplit]) |re.split(pattern, string[, maxsplit]):

按照能够匹配的子串将string分割后返回列表。

maxsplit用于指定最大分割次数,不指定将全部分割。

In [19]:

import re

p = re.compile(r'\d+')

print p.split('one1two2three3four4')

['one', 'two', 'three', 'four', '']

findall(string[, pos[, endpos]]) |re.findall(pattern, string[, flags]):

搜索string,以列表形式返回全部能匹配的子串。

In [21]:

import re

p = re.compile(r'\d+')

print p.findall('one1two2three3four4') 

['1', '2', '3', '4']

sub(repl, string[, count]) |re.sub(pattern, repl, string[, count]):

使用repl替换string中每一个匹配的子串后返回替换后的字符串。

当repl是一个字符串时,可以使用\id或\g、\g引用分组,但不能使用编号0。

当repl是一个方法时,这个方法应当只接受一个参数(Match对象),并返回一个字符串用于替换(返回的字符串中不能再引用分组)。count用于指定最多替换次数,不指定时全部替换。

In [26]:

import re

p = re.compile(r'(\w+) (\w+)')

s = 'i say, hello hanxiaoyang!'

print p.sub(r'\2 \1', s)

def func(m):

   return m.group(1).title() + ' ' + m.group(2).title()

print p.sub(func, s)

say i, hanxiaoyang hello!

I Say, Hello Hanxiaoyang!

Jieba分词

import jieba

seg_list = jieba.cut("我在学习自然语言处理", cut_all=True)

print seg_list

print("Full Mode: " + "/".join(seg_list))  # 全模式

seg_list = jieba.cut("我在学习自然语言处理", cut_all=False)

print("Default Mode: " + "/".join(seg_list))  # 精确模式

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

print(", ".join(seg_list))

seg_list = jieba.cut_for_search("小明硕士毕业于中国科学院计算所,后在哈佛大学深造")  # 搜索引擎模式

print(", ".join(seg_list))

Full Mode: 我/ 在/ 学习/ 自然/ 自然语言/ 语言/ 处理

Default Mode: 我/ 在/ 学习/ 自然语言/ 处理

他, 毕业, 于, 上海交通大学, ,, 在, 百度, 深度, 学习, 研究院, 进行, 研究

小明, 硕士, 毕业, 于, 中国, 科学, 学院, 科学院, 中国科学院, 计算, 计算所, ,, 后, 在, 哈佛, 大学, 哈佛大学, 深造

添加用户自定义词典

很多时候我们需要针对自己的场景进行分词,会有一些领域内的专有词汇。

1.可以用jieba.load_userdict(file_name)加载用户字典

2.少量的词汇可以自己用下面方法手动添加:

用 add_word(word, freq=None, tag=None) 和 del_word(word) 在程序中动态修改词典

用 suggest_freq(segment, tune=True) 可调节单个词语的词频,使其能(或不能)被分出来。

关键词提取

基于 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(analyse.extract_tags(lines,topK=20,withWeight=True,allowPOS=()))

[('韦少',0.3992751425330059), ('杜兰特',0.3550271306011788), ('全明星',0.3092651009333989), ('全明星赛',0.28547547778467586), ('MVP', 0.2818412770821218), ('威少', 0.258354503991945), ('正赛', 0.1409206385410609), ('科尔', 0.11520876149622788), ('投篮', 0.10347133420432222), ('勇士', 0.10345831441143419), ('球员', 0.10128577549591355), ('斯布鲁克', 0.10060562171552064), ('更衣柜', 0.07784399099056974), ('NBA',0.07046031927053045), ('三连庄',0.07046031927053045), ('张卫平',0.07046031927053045), ('西部',0.06834328311194499), ('指导', 0.06261257456404715),('雷霆',0.057147259524047145), ('明星队',0.05189599399371316)]

基于 TextRank 算法的关键词抽取

jieba.analyse.textrank(sentence,topK=20,withWeight=False,allowPOS=('ns', 'n', 'vn', 'v')) 

直接使用,接口相同,注意默认过滤词性。

jieba.analyse.TextRank() 

新建自定义 TextRank 实例

词性标注

jieba.posseg.POSTokenizer(tokenizer=None)新建自定义分词器,tokenizer 参数可指定内部使用的 jieba.Tokenizer 分词器。

jieba.posseg.dt 为默认词性标注分词器。

c802ed108ba5a4707378550c35dd0d3e.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值