Python⽂本分析
正则表达式
#去空格以及特殊符号
s='hello,world!'
print(())#hello,world!
print(('!'))#hello,world
#查找字符(<0为未找到)
str1='hello'
str2='e'
str3='he'
print((str2))#1
print((str3))
1
2
3
4
5
6
7
8
9
10
11
12
Python案例
使⽤re的⼀般步骤是:
1.将正则表达式的字符串形式编译为Pattern实例
2.使⽤Pattern实例处理⽂本并获得匹配结果(⼀个Match实例)
3.使⽤Match实例获得信息,进⾏其他的操作。
e(strPattern[,flag]):这个⽅法是Pattern类的⼯⼚⽅法,⽤于将字符串形式的正则表达式编译为Pattern对象。第⼆个参数flag
是匹配模式,取值可以使⽤按位或运算符’|'表⽰同时⽣效,⽐如re.I|re.M。当然,你也可以在regex字符串中指定模式,⽐如
e(‘pattern’,re.I|re.M)等价于e(’(?im)pattern’)flag可选值有:
#encoding:UTF-8
importre
#将正则表达式编译成Pattern对象
pattern=e(r'hello.*!')#匹配hello开头直到!结尾
#使⽤Pattern匹配⽂本,获得匹配结果,⽆法匹配时将返回None
match=('hello,python!Howareyou?')
ifmatch:
#使⽤Match获得分组信息
print(())
hello,python!
1
2
3
4
5
6
7
8
9
10
11
12
13
re.I(CASE):忽略⼤⼩写(括号内是完整写法,下同)
re.M(MULTILINE):多⾏模式,改变’^‘和’$'的⾏为(参见上图)
re.S(DOTALL):点任意匹配模式,改变’.'的⾏为
re.L(LOCALE):使预定字符类wWbBsS取决于当前区域设定
re.U(UNICODE):使预定字符类wWbBsSdD取决于unicode定义的字符属性
re.X(VERBOSE):详细模式。这个模式下正则表达式可以是多⾏,忽略空⽩字符,并可以加⼊注释。以下两个正则表达式是等价的:
MatchMatch对象是⼀次匹配的结果,包含了很多关于此次匹配的信息,可以使⽤Match提供的可读属性或⽅法来获取这些信息。match
属性:
string:匹配时使⽤的⽂本。
re:匹配时使⽤的Pattern对象。
pos:⽂本中正则表达式开始搜索的索引。值与()和()⽅法的同名参数相同。
endpos:⽂本中正则表达式结束搜索的索引。值与()和()⽅法的同名参数相同。
lastindex:最后⼀个被捕获的分组在⽂本中的索引。如果没有被捕获的分组,将为None。
lastgroup:最后⼀个被捕获的分组的别名。如果这个分组没有别名或者没有被捕获的分组,将为None。
⽅法:
group([group1,…]):获得⼀个或多个分组截获的字符串;指定多个参数时将以元组形式返回。group1可以使⽤编号也可以使⽤别
名;编号0代表整个匹配的⼦串;不填写参数时,返回group(0);没有截获字符串的组返回None;截获了多次的组返回最后⼀次截获
的⼦串
groups([default]):以元组形式返回全部分组截获的字符串。相当于调⽤group(1,2,…last)。default表⽰没有截获字符串的组以这个
值替代,默认为None。
groupdict([default]):返回以有别名的组的别名为键、以该组截获的⼦串为值的字典,没有别名的组不包含在内。default含义同上。
start([group]):返回指定的组截获的⼦串在string中的起始索引(⼦串第⼀个字符的索引)。group默认值为0。
end([group]):返回指定的组截获的⼦串在string中的结束索引(⼦串最后⼀个字符的索引+1)。group默认值为0。
span([group]):返回(start(group),end(group))。
expand(template):将匹配到的分组代⼊template中然后返回。template中可以使⽤id或g、g引⽤分组,但不能使⽤编号0。id
与g是等价的;但10将被认为是第10个分组,如果你想表达1之后是字符’0’,只能使⽤g<1>0。
PatternPattern对象是⼀个编译好的正则表达式,通过Pattern提供的⼀系列⽅法可以对⽂本进⾏匹配查找。Pattern不能直接实例化,必
须使⽤e()进⾏构造。Pattern提供了⼏个可读属性⽤于获取表达式的相关信息:
pattern:编译时⽤的表达式字符串。
flags:编译时⽤的匹配模式。数字形式。
groups:表达式中分组的数量。
groupindex:以表达式中有别名的组的别名为键、以该组对应的编号为值的字典,没有别名的组不包含在内。
使⽤pattern
regex_1=e(r"""d+#数字部分
.#⼩数点部分
d*#⼩数的数字部分""",re.X)
regex_2=e(r"d+.d*")
1
2
3
4
match(string[,pos[,endpos]])|(pattern,string[,flags]):这个⽅法将从string的pos下标处起尝试匹配pattern:如果
pattern结束时仍可匹配,则返回⼀个Match对象如果匹配过程中pattern⽆法匹配,或者匹配未结束就已到达endpos,则返回
None。pos和endpos的默认值分别为0和len(string)。注意:这个⽅法并不是完全匹配。当pattern结束时若string还有剩余字符,
仍然视为成功。想要完全匹配,可以在表达式末尾加上边界匹配符’$’。
arch(string[,pos[,endpos]])|(pattern,string[,flags]):这个⽅法从string的pos下标处起尝试匹配pattern如果
pattern结束时仍可匹配,则返回⼀个Match对象若⽆法匹配,则将pos加1后重新尝试匹配,直到pos=endpos时仍⽆法匹配则返回
None。pos和endpos的默认值分别为0和len(string))
split(string[,maxsplit])|(pattern,string[,maxsplit]):按照能够匹配的⼦串将string分割后返回列表。maxsplit⽤于指定最
⼤分割次数,不指定将全部分割。
findall(string[,pos[,endpos]])|l(pattern,string[,flags]):搜索string,以列表形式返回全部能匹配的⼦串。
finditer(string[,pos[,endpos]])|er(pattern,string[,flags]):搜索string,返回⼀个顺序访问每⼀个匹配结果(Match对
象)的迭代器。
#encoding:UTF-8
importre
#将正则表达式编译成Pattern对象
pattern=e(r'H.*n')#.*表⽰往后匹配任意字符,直到出现g
#使⽤arch()查找匹配的⼦串,不存在能匹配的⼦串时将返回None
#这个例⼦中使⽤match()⽆法成功匹配
match=('Hellopython!')
ifmatch:
#使⽤Match获得分组信息
print(())
Hellopython
1
2
3
4
5
6
7
8
9
10
11
12
13
14
importre
p=e(r'd+')
print(('one1two2three3four4'))
['one','two','three','four','']
1
2
3
4
5
importre
p=e(r'd+')
print(l('one1two2three3four4'))
['1','2','3','4']
1
2
3
4
5
importre
p=e(r'd+')
er('one1two2three3four4'):
print(())
1
2
3
4
1
2
3
4
5
6
7
8
9
sub(repl,string[,count])|(pattern,repl,string[,count]):使⽤repl替换string中每⼀个匹配的⼦串后返回替换后的字符
串。当repl是⼀个字符串时,可以使⽤id或g、g引⽤分组,但不能使⽤编号0。当repl是⼀个⽅法时,这个⽅法应当只接受⼀个参数
(Match对象),并返回⼀个字符串⽤于替换(返回的字符串中不能再引⽤分组)。count⽤于指定最多替换次数,不指定时全部替
换。
subn(repl,string[,count])|(pattern,repl,string[,count]):返回(sub(repl,string[,count]),替换次数)。
jieba中⽂处理
1.基本分词函数与⽤法以及_for_arch返回的结构都是⼀个可迭代的generator,可以使⽤for循环来获得分词后
得到的每⼀个词语(unicode)⽅法接受三个输⼊参数:
需要分词的字符串
cut_all参数⽤来控制是否采⽤全模式
HMM参数⽤来控制是否使⽤HMM(隐马尔科夫)模型
_for_arch⽅法接受两个参数:
需要分词的字符串
是否使⽤HMM模型。
该⽅法适合⽤于搜索引擎构建倒排索引的分词,粒度⽐较细
importre
p=e(r'(w+)(w+)')
s='isay,hellopython!'
print((r'21',s))#sayi,pythonhello!
deffunc(m):
return((1).title()+''+(2).title())
print((func,s))#ISay,HelloPython!
1
2
3
4
5
6
7
8
9
10
11
importre
p=e(r'(w+)(w+)')
s='isay,hellopython!'
print((r'21',s))#('sayi,pythonhello!',2)
deffunc(m):
(1).title()+''+(2).title()
print((func,s))#('ISay,HelloPython!',2)
1
2
3
4
5
6
7
8
9
10
11
以及_for_arch直接返回list
添加⽤户⾃定义词典很多时候我们需要针对⾃⼰的场景进⾏分词,会有⼀些领域内的专有词汇。
1.可以⽤_urdict(file_name)加载⽤户字典
2.少量的词汇可以⾃⼰⽤下⾯⽅法⼿动添加:
⽤add_word(word,freq=None,tag=None)和del_word(word)在程序中动态修改词典
⽤suggest_freq(gment,tune=True)可调节单个词语的词频,使其能(或不能)被分出来。
关键词提取
基于TF-IDF算法的关键词抽取e
t_tags(ntence,topK=20,withWeight=Fal,allowPOS=())ntence为待提取的⽂本topK为返回⼏个
TF/IDF权重最⼤的关键词,默认值为20withWeight为是否⼀并返回关键词权重值,默认值为FalallowPOS仅包括指定词性的
词,默认值为空,即不筛选
#encoding=utf-8
importjieba
g_list=("我在学习⾃然语⾔处理",cut_all=True)
print(g_list)
print("FullMode:"+"/".join(g_list))#全模式(有重复)
FullMode:我/在/学习/⾃然/⾃然语⾔/语⾔/处理
g_list=("我在学习⾃然语⾔处理",cut_all=Fal)
print("DefaultMode:"+"/".join(g_list))#精确模式
DefaultMode:我/在/学习/⾃然语⾔/处理
g_list=("他毕业于上海交通⼤学,在百度深度学习研究院进⾏研究")#默认是精确模式
print(",".join(g_list))
他/毕业/于/上海交通⼤学/,/在/百度/深度/学习/研究院/进⾏/研究
g_list=_for_arch("⼩明硕⼠毕业于中国科学院计算所,后在哈佛⼤学深造")#搜索引擎模式
print(",".join(g_list))
⼩明/硕⼠/毕业/于/中国/科学/学院/科学院/中国科学院/计算/计算所/,/后/在/哈佛/⼤学/哈佛⼤学/深造
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
result_lcut=("⼩明硕⼠毕业于中国科学院计算所,后在哈佛⼤学深造")
print(result_lcut)
['⼩明','硕⼠','毕业','于','中国科学院','计算所',',','后','在','哈佛⼤学','深造']
print("/".join(result_lcut))
⼩明/硕⼠/毕业/于/中国科学院/计算所/,/后/在/哈佛⼤学/深造
print("/".join(_for_arch("⼩明硕⼠毕业于中国科学院计算所,后在哈佛⼤学深造")))
⼩明/硕⼠/毕业/于/中国/科学/学院/科学院/中国科学院/计算/计算所/,/后/在/哈佛/⼤学/哈佛⼤学/深造
1
2
3
4
5
6
7
8
9
print('/'.join(('如果放到旧字典中将出错。',HMM=Fal)))
如果/放到/旧/字典/中将/出错/。
t_freq(('中','将'),True)
_word('旧字典')
print('/'.join(('如果放到旧字典中将出错。',HMM=Fal)))
如果/放到/旧字典/中/将/出错/。
1
2
3
4
5
6
7
关于TF-IDF算法的关键词抽取补充
关键词提取所使⽤逆向⽂件频率(IDF)⽂本语料库可以切换成⾃定义语料库的路径
⽤法:_idf_path(file_name)#file_name为⾃定义语料库的路径
⾃定义语料库⽰例见
⽤法⽰例见
关键词提取所使⽤停⽌词(StopWords)⽂本语料库可以切换成⾃定义语料库的路径
⽤法:_stop_words(file_name)#file_name为⾃定义语料库的路径
⾃定义语料库⽰例见
⽤法⽰例见
关键词⼀并返回关键词权重值⽰例
⽤法⽰例见
基于TextRank算法的关键词抽取
nk(ntence,topK=20,withWeight=Fal,allowPOS=(‘ns’,‘n’,‘vn’,‘v’))直接使⽤,接⼝相
同,注意默认过滤词性。
nk()新建⾃定义TextRank实例
算法论⽂:
基本思想:
将待抽取关键词的⽂本进⾏分词
以固定窗⼝⼤⼩(默认为5,通过span属性调整),词之间的共现关系,构建图
计算图中节点的PageRank,注意是⽆向带权图
词性标注
enizer(tokenizer=None)新建⾃定义分词器,tokenizer参数可指定内部使⽤的zer分词器。
为默认词性标注分词器。
标注句⼦分词后每个词的词性,采⽤和ictclas兼容的标记法。
具体的词性对照表参见
easanaly
lines=open('','rb').read()
print("".join(t_tags(lines,topK=20,withWeight=Fal,allowPOS=())))
韦少杜兰特全明星全明星赛MVP威少正赛科尔投篮勇⼠球员斯布鲁克更⾐柜NBA三连庄张卫平西部指导雷霆明星队
lines=open(u'西游记.txt','rb').read()
print("".join(t_tags(lines,topK=20,withWeight=Fal,allowPOS=())))
⾏者⼋戒师⽗三藏唐僧⼤圣沙僧妖精菩萨和尚那怪那⾥长⽼呆⼦徒弟怎么不知⽼孙国王⼀个
1
2
3
4
5
6
7
8
9
lines=open('','rb').read()
print("".join(nk(lines,topK=20,withWeight=Fal,allowPOS=('ns','n','vn','v'))))
全明星赛勇⼠正赛指导对⽅投篮球员没有出现时间威少认为看来结果相隔助攻现场三连庄介绍嘉宾
print("".join(nk(lines,topK=20,withWeight=Fal,allowPOS=('ns','n'))))
勇⼠正赛全明星赛指导投篮玩命时间对⽅现场结果球员嘉宾时候全队主持⼈照⽚全程⽬标快船队肥皂剧
1
2
3
4
5
6
并⾏分词
原理:将⽬标⽂本按⾏分隔后,把各⾏⽂本分配到多个Python进程并⾏分词,然后归并结果,从⽽获得分词速度的可观提升基于python
⾃带的multiprocessing模块,⽬前暂不⽀持Windows⽤法:
_parallel(4)#开启并⾏分词模式,参数为并⾏进程数
e_parallel()#关闭并⾏分词模式
实验结果:在4核3.4GHzLinux机器上,对⾦庸全集进⾏精确分词,获得了1MB/s的速度,是单进程版的3.3倍。
注意:并⾏分词仅⽀持默认分词器和。
Tokenize:返回词语在原⽂的起⽌位置
注意,输⼊参数只接受unicode
ChineAnalyzerforWhoosh搜索引擎
eimportChineAnalyzer
aspg
words=("我爱⾃然语⾔处理")
forword,flaginwords:
print('%s%s'%(word,flag))
我r
爱v
⾃然语⾔l
处理v
1
2
3
4
5
6
7
8
print"这是默认模式的tokenize"
result=ze(u'⾃然语⾔处理⾮常有⽤')
fortkinresult:
print("%sttstart:%dttend:%d"%(tk[0],tk[1],tk[2]))
print"n-----------我是神奇的分割线------------n"
print"这是搜索模式的tokenize"
result=ze(u'⾃然语⾔处理⾮常有⽤',mode='arch')
fortkinresult:
print("%sttstart:%dttend:%d"%(tk[0],tk[1],tk[2]))
这是默认模式的tokenize
⾃然语⾔start:0end:4
Loadingmodelcost0.950conds.
处理start:4end:6
Prefixdicthasbeenbuiltsuccessfully.
⾮常start:6end:8
有⽤start:8end:10
-----------我是神奇的分割线------------
这是搜索模式的tokenize
⾃然start:0end:2
语⾔start:2end:4
⾃然语⾔start:0end:4
处理start:4end:6
⾮常start:6end:8
有⽤start:8end:10
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
命令⾏分词
#-*-coding:UTF-8-*-
from__future__importunicode_literals
importsys,os
("../")
mportcreate_in,open_dir
import*
rimportQueryParr
analyzer=eAnalyzer()
schema=Schema(title=TEXT(stored=True),path=ID(stored=True),content=TEXT(stored=True,analyzer=analyzer))
("tmp"):
("tmp")
ix=create_in("tmp",schema)#forcreatenewindex
#ix=open_dir("tmp")#forreadonly
writer=()
_document(
title="document1",
path="/a",
content="Thisisthefirstdocumentwe’veadded!"
)
_document(
title="document2",
path="/b",
content="Thecondone你中⽂测试中⽂ivenmoreinteresting!吃⽔果"
)
_document(
title="document3",
path="/c",
content="买⽔果然后来世博园。"
)
_document(
title="document4",
path="/c",
content="⼯信处⼥⼲事每⽉经过下属科室都要亲⼝交代24⼝交换机等技术性器件的安装⼯作"
)
_document(
title="document4",
path="/c",
content="咱俩交换⼀下吧。"
)
()
archer=er()
parr=QueryParr("content",schema=)
forkeywordin("⽔果世博园","你","first","中⽂","交换机","交换"):
print(keyword+"的结果为如下:")
q=(keyword)
results=(q)
forhitinresults:
print(ghts("content"))
print("n--------------我是神奇的分割线--------------n")
fortinanalyzer("我的好朋友是李明;我爱北京天安门;IBM和Microsoft;intetestingandinterestedmealot"):
print()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
使⽤⽰例:>cut_
命令⾏选项(翻译):
使⽤:python-mjieba[options]filename
结巴命令⾏界⾯。
固定参数:
filename输⼊⽂件
可选参数:
-h,--help显⽰此帮助信息并退出
-d[DELIM],--delimiter[DELIM]
使⽤DELIM分隔词语,⽽不是⽤默认的’/'。
若不指定DELIM,则使⽤⼀个空格分隔。
-p[DELIM],--pos[DELIM]
启⽤词性标注;如果指定DELIM,词语和词性之间
⽤它分隔,否则⽤_分隔
-DDICT,--dictDICT使⽤DICT代替默认词典
-uUSER_DICT,--ur-dictUSER_DICT
使⽤USER_DICT作为附加词典,与默认词典或⾃定义词典配合使⽤
-a,--cut-all全模式分词(不⽀持词性标注)
-n,--no-hmm不使⽤隐含马尔可夫模型
-q,--quiet不输出载⼊信息到STDERR
-V,--version显⽰版本信息并退出
如果没有指定⽂件名,则使⽤标准输⼊。
本文发布于:2022-11-25 07:17:15,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/90/17051.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |