本文介绍自然语言处理的基础操作,主要为正则表达式和jieba分词,整理来自B站https://www.bilibili.com/video/BV1is411E7vR?from=search&seid=17199998704756408851
正则表达式
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 为默认词性标注分词器。