【自然语言处理(一)】相关基础技能
1.python字符串相关操作
s1 = " hello "
s2 = " world! "
#去除字符串左右两边的空格
s1 = s1.strip()
s2 = s2.strip()
#拼接字符串
s = s1+s2
#查找字符或子串
s_index = s.index('hello')
#字符串大小写转换
s3 = "ABC"
s4 = "abc"
s3_lower = s3.lower()
s4_upper = s4.upper()
#翻转字符串
s_reverse = s[::-1]
#查找字符串
s_find = s.find("hello")
#分割字符串
s5 = "a,b,c,d,e"
s5_split = s5.split(",")
import re
from collections import Counter
#获取字符串中出现最多次数的字符
def count_char(str):
str = str.lower()
res = re.findall("[a-z]",str)
count = Counter(res)
return [k for k,v in count.items() if v==max(list(count.values()))]
2.正则表达式(网上很多教程,关键还是理解每一个代表什么意思,还要多写,其实没什么大不了,这里就不写了)就只写写python中是怎么用的
import re
#compile传入两个参数,第一个是pattern,第二个是flag(这个根据实际情况使用)
pattern = re.compile(r"(w+) (w+)(?P<sign>.*)")
match = pattern.match("hello gongoubo!")
if match:
#匹配时使用的文本
print(match.string)
#匹配时使用的pattern对象
print(match.re)
#开始搜索的索引
print(match.pos)
#结束搜索的索引
print(match.endpos)
#最后一个分组的索引
print(match.lastindex)
#最后一个分组别名
print(match.lastgroup)
print(match.group(1,2))
print(match.groups())
print(match.groupdict())
print(match.start(2))
print(match.end(2))
print(match.span(2))
print(match.expand(r'2 13'))
(1)进行制定的切分
import re
pattern = re.compile(r"d+")
print(pattern.split("one1two2three3four4"))
(2)返回全部匹配的字符串
import re
pattern = re.compile(r"d+")
print(pattern.findall("one1two2three3four4"))
(3)替换掉符合某种模式的字符串
import re
pattern1 = re.compile(r"(w+) (w+)")
pattern2 =re.compile(r' ')
s1="say i hellogongoubo"
s2="ni hao a "
print(pattern1.sub(r'2 1',s1))
print(pattern2.sub(r'!',s2))
3.jieba中文处理
import jieba
#全模式:把句子中所有的可以成词的词语都扫描出来,速度非常快,但不能解决歧义;
seg_list= jieba.cut("我爱学习自然语言处理",cut_all=True,HMM=False)
print("Full Mode:"+"/".join(seg_list))
#精确模式,如不指定,默认是这个模式,适合文本分析;
seg_list= jieba.cut("我爱学习自然语言处理",cut_all=False,HMM=False)
print("Full Mode:"+"/".join(seg_list))
#搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率
seg_list=jieba.cut_for_search("小明硕士毕业于中国科学技术学院计算所,后在哈佛大学深造")
print("Full Mode:"+"/".join(seg_list))
#lcut,lcut_for_search返回的是列表
seg_list= jieba.lcut("我爱学习自然语言处理",cut_all=True)
print(seg_list)
(1)添加用户自定义词典:
1)可以利用jieba.load_userdict(file_name)加载用户字典;
2)少量词汇可以手动添加:
- add_word(word,freq=None,lag=None)和del_word(word)在程序中动态修改字典,这时HMM要设置为False
- 用suggest_freq(segment,tune=True)可调节单个词语的词频,使其能(或不能)被分出来
import jieba
seg_list= jieba.cut("如果放在旧字典中将出错",cut_all=False,HMM=False)
print(','.join(seg_list))
jieba.suggest_freq(("中","将"),tune=True)
seg_list= jieba.cut("如果放在旧字典中将出错",cut_all=False,HMM=False)
print(','.join(seg_list))
会发现"中将"被拆为"中"和"将"了。
(2)基于TF-IDF算法的关键词提取
jieba.analyse.extract_tags(sentense,topK=20,withWeight=False,allowPOS=())
sentense:待提取的文本
topK:返回权重较大的前多少个关键词
withWeight:是否一并返回权重值,默认为False
allowPOS:仅保留指定词性的词,默认为空
from jieba import analyse
text = "Python是一种跨平台的计算机程序设计语言。是一种面向对象的动态类型语言,"
"最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,"
"越来越多被用于独立的、大型项目的开发。"
print(" ".join(analyse.extract_tags(text)))
注意:关键词提取所使用的的逆文档频率(IDF)文本语料库可以切换成自定义语料库的路径:
jieba.analyse.set_idf_path(file_name)
关键词提取所使用的停止词文本语料库也可以切换成自定义语料库的路径:
jieba.analyse.set_stop_words(file_name)
(2)基于TextRank算法的关键词提取
jieba.analyse.textrank(sentense,topK=20,withWeight=False,allowPOS=('ns','n','vn','v'))
基本思想:
- 将待提取的关键词进行文本分词;
- 以固定窗口大小(默认为5,通过span属性调整),词之间的共现关系,构建图;
- 计算图中节点的PageRank;(无向带权图)
from jieba import analyse
text = "Python是一种跨平台的计算机程序设计语言。是一种面向对象的动态类型语言,"
"最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,"
"越来越多被用于独立的、大型项目的开发。"
print(" ".join(analyse.textrank(text)))
(3)词性标注
jieba.posseg.POSTTokenizer(tokenizer=None)新建自定义分词器,tokenizer参数可指定内部使用的jieba.Tokenizer分词器。jieba.prosseg.dt默认词性标注分词器;
标注句子分词后每个词的词性,采用和ictclas兼容的标记法;
from jieba import posseg
text = "我爱自然语言处理"
words = posseg.cut(text)
for word, flag in words:
print("{},{}".format(word,flag))
(4)并行分词
jieba.enable_parallel()
import jieba
import time
content=open(u'遮天.txt').read()
def en_parallel(content):
jieba.enable_parallel()
t1=time.time()
words = "/".join(jieba.cut(content))
t2=time.time()
tm_cost=t2-t1
print("并行分词速度为{} bytes/second".format(len(content)/tm_cost))
def dis_parallel(content):
jieba.disable_parallel()
t1=time.time()
words = "/".join(jieba.cut(content))
t2=time.time()
tm_cost=t2-t1
print("非并行分词速度为{} bytes/second".format(len(content)/tm_cost))
在windows环境下会报错,由于没有Linux系统就不试了
(5)Tokenize:返回词语在原文的起止位置
import jieba
#默认模式
result=jieba.tokenize(u'自然语言处理有用')
for tk in result:
print("%stt start: %d tt end: %d" % (tk[0],tk[1],tk[2]))
#搜索模式
result=jieba.tokenize(u'自然语言处理有用',mode='search')
for tk in result:
print("%stt start: %d tt end: %d" % (tk[0],tk[1],tk[2]))
- 巧用linux命令做图片下载器(r4笔记第7天)
- Spring+SpringMVC+MyBatis+easyUI整合优化篇(四)单元测试实例
- Spring+SpringMVC+MyBatis+easyUI整合优化篇(五)结合MockMvc进行服务端的单元测试
- 关于order by中的数据排序(r4笔记第6天)
- 深度学习CTPN+CRNN模型实现图片内文字的定位与识别(OCR)
- Markdown语法讲解及MWeb使用教程
- 通过Linu命令实现屏幕录制和回放(r4笔记第5天)
- 用keras对国产剧评论文本的情感进行预测
- python常用可视化技巧
- Spring+SpringMVC+MyBatis+easyUI整合基础篇(六)maven整合SSM
- 通过java程序抽取日志中的sql语句(r4笔记第4天)
- Spring+SpringMVC+MyBatis+easyUI整合基础篇(七)JDBC url的连接参数
- Spring+SpringMVC+MyBatis+easyUI整合基础篇(十)SVN搭建
- position:sticky的兼容性尝试
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- GitHub-标签管理
- 经典写配置漏洞与几种变形
- GitLab安装及使用
- 持续集成-Jenkins安装部署
- 谈一谈Linux与suid提权
- PHP动态特性的捕捉与逃逸
- ES6 随性学习之 新增数据类型 Symbol
- 最简单入门深度学习
- 持续集成-Jenkins常用插件安装
- 小白学PyTorch | 15 TF2实现一个简单的服装分类任务
- 小白学PyTorch | 16 TF2读取图片的方法
- 小白学PyTorch | 17 TFrec文件的创建与读取
- 小白学PyTorch | 18 TF2构建自定义模型
- 扩展之Tensorflow2.0 | 19 TF2模型的存储与载入
- 扩展之Tensorflow2.0 | 20 TF2的eager模式与求导