# 去空格以及特殊符号
s = ' hello, world!'
print(s.strip()) # hello, world!
print(s.rstrip('!')) # hello, world
# 查找字符( <0 为未找到)
str1 = 'hello'
str2 = 'e'
str3 = 'he'
print(str1.index(str2)) # 1
print(str1.find(str3))
使用re的一般步骤是:
# encoding: UTF-8
import re
# 将正则表达式编译成Pattern对象
pattern = re.compile(r'hello.*\!') # 匹配hello开头直到!结尾
# 使用Pattern匹配文本,获得匹配结果,无法匹配时将返回None
match = pattern.match('hello, python! How are you?')
if match:
# 使用Match获得分组信息
print(match.group())
hello, python!
re.compile(strPattern[, flag]):
这个方法是Pattern类的工厂方法,用于将字符串形式的正则表达式编译为Pattern对象。
第二个参数flag是匹配模式,取值可以使用按位或运算符’|'表示同时生效,比如re.I | re.M。
当然,你也可以在regex字符串中指定模式,比如re.compile(‘pattern’, re.I | re.M)等价于re.compile(’(?im)pattern’)
flag可选值有:
regex_1 = re.compile(r"""\d + # 数字部分
\. # 小数点部分
\d * # 小数的数字部分""", re.X)
regex_2 = re.compile(r"\d+\.\d*")
Match
Match对象是一次匹配的结果,包含了很多关于此次匹配的信息,可以使用Match提供的可读属性或方法来获取这些信息。
match属性:
方法:
Pattern
Pattern对象是一个编译好的正则表达式,通过Pattern提供的一系列方法可以对文本进行匹配查找。
Pattern不能直接实例化,必须使用re.compile()进行构造。
Pattern提供了几个可读属性用于获取表达式的相关信息:
使用pattern
# encoding: UTF-8
import re
# 将正则表达式编译成Pattern对象
pattern = re.compile(r'H.*n') # .* 表示往后匹配任意字符,直到出现g
# 使用search()查找匹配的子串,不存在能匹配的子串时将返回None
# 这个例子中使用match()无法成功匹配
match = pattern.search('Hello python!')
if match:
# 使用Match获得分组信息
print(match.group())
Hello python
import re
p = re.compile(r'\d+')
print(p.split('one1two2three3four4'))
['one', 'two', 'three', 'four', '']
import re
p = re.compile(r'\d+')
print(p.findall('one1two2three3four4'))
['1', '2', '3', '4']
import re
p = re.compile(r'\d+')
for m in p.finditer('one1two2three3four4'):
print(m.group())
1
2
3
4
import re
p = re.compile(r'(\w+) (\w+)')
s = 'i say, hello python!'
print(p.sub(r'\2 \1', s)) # say i, python hello!
def func(m):
return(m.group(1).title() + ' ' + m.group(2).title())
print(p.sub(func, s)) # I Say, Hello Python!
import re
p = re.compile(r'(\w+) (\w+)')
s = 'i say, hello python!'
print(p.subn(r'\2 \1', s)) # ('say i, python hello!', 2)
def func(m):
return m.group(1).title() + ' ' + m.group(2).title()
print(p.subn(func, s)) # ('I Say, Hello Python!', 2)
1.基本分词函数与用法
jieba.cut 以及 jieba.cut_for_search 返回的结构都是一个可迭代的 generator,可以使用 for 循环来获得分词后得到的每一个词语(unicode)
jieba.cut 方法接受三个输入参数:
jieba.cut_for_search 方法接受两个参数:
# encoding=utf-8
import jieba
seg_list = jieba.cut("我在学习自然语言处理", cut_all=True)
print(seg_list)
print("Full Mode: " + "/ ".join(seg_list)) # 全模式(有重复)
Full Mode: 我/ 在/ 学习/ 自然/ 自然语言/ 语言/ 处理
seg_list = jieba.cut("我在学习自然语言处理", cut_all=False)
print("Default Mode: " + "/ ".join(seg_list)) # 精确模式
Default Mode: 我/ 在/ 学习/ 自然语言/ 处理
seg_list = jieba.cut("他毕业于上海交通大学,在百度深度学习研究院进行研究") # 默认是精确模式
print(", ".join(seg_list))
他/毕业/于/上海交通大学/,/在/百度/深度/学习/研究院/进行/研究
seg_list = jieba.cut_for_search("小明硕士毕业于中国科学院计算所,后在哈佛大学深造") # 搜索引擎模式
print(", ".join(seg_list))
小明/硕士/毕业/于/中国/科学/学院/科学院/中国科学院/计算/计算所/,/后/在/哈佛/大学/哈佛大学/深造
jieba.lcut以及jieba.lcut_for_search直接返回 list
result_lcut = jieba.lcut("小明硕士毕业于中国科学院计算所,后在哈佛大学深造")
print(result_lcut)
['小明', '硕士', '毕业', '于', '中国科学院', '计算所', ',', '后', '在', '哈佛大学', '深造']
print("/".join(result_lcut))
小明/硕士/毕业/于/中国科学院/计算所/,/后/在/哈佛大学/深造
print("/".join(jieba.lcut_for_search("小明硕士毕业于中国科学院计算所,后在哈佛大学深造")))
小明/硕士/毕业/于/中国/科学/学院/科学院/中国科学院/计算/计算所/,/后/在/哈佛/大学/哈佛大学/深造
添加用户自定义词典
很多时候我们需要针对自己的场景进行分词,会有一些领域内的专有词汇。
print('/'.join(jieba.cut('如果放到旧字典中将出错。', HMM=False)))
如果/放到/旧/字典/中将/出错/。
jieba.suggest_freq(('中', '将'), True)
jieba.add_word('旧字典')
print('/'.join(jieba.cut('如果放到旧字典中将出错。', HMM=False)))
如果/放到/旧字典/中/将/出错/。
基于 TF-IDF 算法的关键词抽取
import jieba.analyse
import jieba.analyse as analyse
lines = open('NBA.txt', 'rb').read()
print(" ".join(analyse.extract_tags(lines, topK=20, withWeight=False, allowPOS=())))
韦少 杜兰特 全明星 全明星赛 MVP 威少 正赛 科尔 投篮 勇士 球员 斯布鲁克 更衣柜 NBA 三连庄 张卫平 西部 指导 雷霆 明星队
lines = open(u'西游记.txt', 'rb').read()
print(" ".join(analyse.extract_tags(lines, topK=20, withWeight=False, allowPOS=())))
行者 八戒 师父 三藏 唐僧 大圣 沙僧 妖精 菩萨 和尚 那怪 那里 长老 呆子 徒弟 怎么 不知 老孙 国王 一个
关于TF-IDF 算法的关键词抽取补充
基于 TextRank 算法的关键词抽取
算法论文: TextRank: Bringing Order into Texts
基本思想:
lines = open('NBA.txt', 'rb').read()
print(" ".join(analyse.textrank(lines, topK=20, withWeight=False, allowPOS=('ns', 'n', 'vn', 'v'))))
全明星赛 勇士 正赛 指导 对方 投篮 球员 没有 出现 时间 威少 认为 看来 结果 相隔 助攻 现场 三连庄 介绍 嘉宾
print(" ".join(analyse.textrank(lines, topK=20, withWeight=False, allowPOS=('ns', 'n'))))
勇士 正赛 全明星赛 指导 投篮 玩命 时间 对方 现场 结果 球员 嘉宾 时候 全队 主持人 照片 全程 目标 快船队 肥皂剧
import jieba.posseg as pseg
words = pseg.cut("我爱自然语言处理")
for word, flag in words:
print('%s %s' % (word, flag))
我 r
爱 v
自然语言 l
处理 v
原理:将目标文本按行分隔后,把各行文本分配到多个 Python 进程并行分词,然后归并结果,从而获得分词速度的可观提升 基于 python 自带的 multiprocessing 模块,目前暂不支持 Windows
用法:
实验结果:在 4 核 3.4GHz Linux 机器上,对金庸全集进行精确分词,获得了 1MB/s 的速度,是单进程版的 3.3 倍。
注意:并行分词仅支持默认分词器 jieba.dt 和 jieba.posseg.dt。
注意,输入参数只接受 unicode
print "这是默认模式的tokenize"
result = jieba.tokenize(u'自然语言处理非常有用')
for tk in result:
print("%s\t\t start: %d \t\t end:%d" % (tk[0],tk[1],tk[2]))
print "\n-----------我是神奇的分割线------------\n"
print "这是搜索模式的tokenize"
result = jieba.tokenize(u'自然语言处理非常有用', mode='search')
for tk in result:
print("%s\t\t start: %d \t\t end:%d" % (tk[0],tk[1],tk[2]))
这是默认模式的tokenize
自然语言 start: 0 end:4
Loading model cost 0.950 seconds.
处理 start: 4 end:6
Prefix dict has been built successfully.
非常 start: 6 end:8
有用 start: 8 end:10
-----------我是神奇的分割线------------
这是搜索模式的tokenize
自然 start: 0 end:2
语言 start: 2 end:4
自然语言 start: 0 end:4
处理 start: 4 end:6
非常 start: 6 end:8
有用 start: 8 end:10
from jieba.analyse import ChineseAnalyzer
# -*- coding: UTF-8 -*-
from __future__ import unicode_literals
import sys,os
sys.path.append("../")
from whoosh.index import create_in,open_dir
from whoosh.fields import *
from whoosh.qparser import QueryParser
analyzer = jieba.analyse.ChineseAnalyzer()
schema = Schema(title=TEXT(stored=True), path=ID(stored=True), content=TEXT(stored=True, analyzer=analyzer))
if not os.path.exists("tmp"):
os.mkdir("tmp")
ix = create_in("tmp", schema) # for create new index
#ix = open_dir("tmp") # for read only
writer = ix.writer()
writer.add_document(
title="document1",
path="/a",
content="This is the first document we’ve added!"
)
writer.add_document(
title="document2",
path="/b",
content="The second one 你 中文测试中文 is even more interesting! 吃水果"
)
writer.add_document(
title="document3",
path="/c",
content="买水果然后来世博园。"
)
writer.add_document(
title="document4",
path="/c",
content="工信处女干事每月经过下属科室都要亲口交代24口交换机等技术性器件的安装工作"
)
writer.add_document(
title="document4",
path="/c",
content="咱俩交换一下吧。"
)
writer.commit()
searcher = ix.searcher()
parser = QueryParser("content", schema=ix.schema)
for keyword in ("水果世博园","你","first","中文","交换机","交换"):
print(keyword+"的结果为如下:")
q = parser.parse(keyword)
results = searcher.search(q)
for hit in results:
print(hit.highlights("content"))
print("\n--------------我是神奇的分割线--------------\n")
for t in analyzer("我的好朋友是李明;我爱北京天安门;IBM和Microsoft; I have a dream. this is intetesting and interested me a lot"):
print(t.text)
使用示例:python -m jieba news.txt > cut_result.txt
命令行选项(翻译):
使用: python -m jieba [options] filename
结巴命令行界面。
固定参数:
filename 输入文件
可选参数:
-h, --help 显示此帮助信息并退出
-d [DELIM], --delimiter [DELIM]
使用 DELIM 分隔词语,而不是用默认的’ / '。
若不指定 DELIM,则使用一个空格分隔。
-p [DELIM], --pos [DELIM]
启用词性标注;如果指定 DELIM,词语和词性之间
用它分隔,否则用 _ 分隔
-D DICT, --dict DICT 使用 DICT 代替默认词典
-u USER_DICT, --user-dict USER_DICT
使用 USER_DICT 作为附加词典,与默认词典或自定义词典配合使用
-a, --cut-all 全模式分词(不支持词性标注)
-n, --no-hmm 不使用隐含马尔可夫模型
-q, --quiet 不输出载入信息到 STDERR
-V, --version 显示版本信息并退出
如果没有指定文件名,则使用标准输入。