【NLP】Python NLTK处理原始文本
Python NLTK 处理原始文本
作者:白宁超
2016年11月8日22:45:44
摘要:NLTK是由宾夕法尼亚大学计算机和信息科学使用python语言实现的一种自然语言工具包,其收集的大量公开数据集、模型上提供了全面、易用的接口,涵盖了分词、词性标注(Part-Of-Speech tag, POS-tag)、命名实体识别(Named Entity Recognition, NER)、句法分析(Syntactic Parse)等各项 NLP 领域的功能。本文主要介绍:1)怎样编写程序访问本地和网络上的文件,从而获得无限的语言材料?2)如何把文档分割成单独的单词和标点符号,并进行文本语料上的分析?3)怎样编写程序产生格式化输出,并把结果保存在文件中?关于Python基础知识可以参看本人的【Python五篇慢慢弹】系列文章(本文原创编著,转载注明出处:Python NLTK处理原始文本)
目录
【Python NLP】干货!详述Python NLTK下如何使用stanford NLP工具包(1)
【Python NLP】Python 自然语言处理工具小结(2)
【Python NLP】Python NLTK 走进大秦帝国(3)
【Python NLP】Python NLTK获取文本语料和词汇资源(4)
【Python NLP】Python NLTK处理原始文本(5)
关于处理原始文本部分导入语句:
>>> from __future__ import division
>>> import nltk,re,pprint
1 从网络和硬盘访问文本(在线获取伤寒杂病论)
python网络访问程序:
>>> from __future__ import division
>>> import nltk,re,pprint
>>> from urllib.request import urlopen
>>> url=r'http://www.gutenberg.org/files/24272/24272-0.txt'
>>> raw=urlopen(url).read()
>>> raw = raw.decode('utf-8')
>>> len(raw)
70306
>>> raw[2000:2500]
运行结果:

对其中文分词:
>>> from nltk.tokenize import StanfordSegmenter
>>> segmenter = StanfordSegmenter(
path_to_jar=r"E:\tools\stanfordNLTK\jar\stanford-segmenter.jar",
path_to_slf4j=r"E:\tools\stanfordNLTK\jar\slf4j-api.jar",
path_to_sihan_corpora_dict=r"E:\tools\stanfordNLTK\jar\data/",
path_to_model=r"E:\tools\stanfordNLTK\jar\data\pku.gz",
path_to_dict=r"E:\tools\stanfordNLTK\jar\data\dict-chris6.ser.gz"
)
>>> result = segmenter.segment(raw)
>>> result[1000:2500]
分词结果:

2 在线获取处理HTML文本(红楼梦)
在线获取html文本资料:
>>> import re,nltk
>>> from urllib.request import urlopen
>>> url='http://www.gutenberg.org/cache/epub/24264/pg24264-images.html'
>>> html=urlopen(url).read()
>>> html=html.decode('utf-8')
>>> html[5000:5500]
运行结果:

相关正则知识:
- \d 匹配一个数字
- \w 匹配一个字母或者数字
- * 任意个字符(包括0个),
- + 至少一个字符
- ? 0个或1个字符
- {n} n个字符
- {n,m} n-m个字符
- \s 匹配一个空格
- \s+ 至少有一个空格
- \d{3,8} 表示3-8个数字,例如'1234567'
- \d{3}\s+\d{3,8}
- [0-9a-zA-Z\_] 匹配一个数字、字母或者下划线
- [0-9a-zA-Z\_]+ 匹配至少由一个数字、字母或者下划线组成的字符串,
- 比如'a100','0_Z','Py3000'等等;
- [a-zA-Z\_][0-9a-zA-Z\_]*可以匹配由字母或下划线开头,后接任意个由一个数字、字母或者下划线组成的字符串,也就是Python合法的变量
- [a-zA-Z\_][0-9a-zA-Z\_]{0, 19}更精确地限制了变量的长度是1-20个字符(前面1个字符+后面最多19个字符)
- A|B可以匹配A或B,所以(P|p)ython可以匹配'Python'或者'python'
- ^表示行的开头,^\d表示必须以数字开头
- $表示行的结束,\d$表示必须以数字结束
正则表达式进行数据清洗:
>>> len(html)
962651
>>> strhtml=re.sub("[\s+\.\!\/_,$%^*(+\"\']+|[+——!,。??、~@#¥%……&*()]+|[A-Za-z0-9]+","",html)#去掉中英文符号
>>> len(strhtml)
781150
>>> strhtml[5000:5500]
清洗后结果:

红楼梦进行中文分词
>>> # 红楼梦进行中文分词
>>> from nltk.tokenize import StanfordSegmenter
>>> segmenter = StanfordSegmenter(
path_to_jar=r"E:\tools\stanfordNLTK\jar\stanford-segmenter.jar",
path_to_slf4j=r"E:\tools\stanfordNLTK\jar\slf4j-api.jar",
path_to_sihan_corpora_dict=r"E:\tools\stanfordNLTK\jar\data/",
path_to_model=r"E:\tools\stanfordNLTK\jar\data\pku.gz",
path_to_dict=r"E:\tools\stanfordNLTK\jar\data\dict-chris6.ser.gz"
)
>>> result = segmenter.segment(raw)
查找分析:查找“曰”后面的内容
re.findall(r'(曰.{,3})',strhtml)

备注:处理搜索引擎的结果:基于自己配置的搜索引擎处理
3 处理RSS订阅
>>> import feedparser #feedparser需要在python库中下载
>>> llog=feedparser.parse(url)
4 读取本地文件:strip()方法删除输入行结尾的换行符
方法一:
>>> f=open(r"E:\dict\q0.txt","r")
>>> for line in f:
print(line.strip())
方法二:
>>> with open(r"C:\Users\cuitbnc\Desktop\dqdg.txt","r+") as f:
str=f.read()
方法三:
>>> import nltk
>>> path=nltk.data.find(r'C:\Users\cuitbnc\Desktop\dqdg.txt')
>>> raw=open(path,'rU').read()
>>> len(raw)
673167
>>>
PDF或者MSWord以及其他二进制提取文本,利用第三方函数库pypdf和pywin32
>>> raw=open(r"E:\dict\q0.txt","r").read()
>>> tokens=nltk.word_tokenize(raw)
>>> words=[w for w in tokens]
>>> vocab=sorted(set(words))
>>> vocab
5 字符串:最底层的文本处理
有用的字符串方法:
- s.find(t) 字符串s中包含t的第一个索引s.rfind(t) 字符串s中包含t的最后一个索引
- s.index(t) 与s.find(t)类似
- s.rindex(t) 与s.rfind(t)类似
- s.join(text)
- s.split(t) 字符串分割
- s.splitlines()
- s.lower()
- s.upper()
- s.titlecase() s首字母大写
- s.strip() 返回一个没有首尾空白字符的s的复制
- s.replace(t,u) 用u替换s中的t
链表和字符串的差异:字符串和链表都是一种序列,可以通过索引抽取他们一部分,可以切片,可以合并。但是,链表和字符串不能连接
6 使用Unicode进行文字处理
解码:文件中的文本都有特定的编码,需要一些机制将文本翻译成Unicode的过程就是解码。 编码:将Uniocde写入一个文件或者终端,首先需要将Unicode转化为合适的编码,这个过程就是编码
中文解码问题
>>> raw=open(r"E:\dict\text.txt","r").read()
Traceback (most recent call last):
File "<pyshell#18>", line 1, in <module>
raw=open(r"E:\dict\text.txt","r").read()
UnicodeDecodeError: 'gbk' codec can't decode byte 0x80 in position 16: illegal multibyte sequence
>>> import codecs
>>> f=codecs.open(r"E:\dict\text.txt",'r',encoding="utf-8").read()
ord()查找字符的整数序列
>>> ord('a')
97
>>> ord('f')
102
7 使用正则表达式检测词组搭配
import re 导入re函数库
re.search('ed$',w)查询w字符串中是都ed结尾匹配 [w for w in wordlist if re,search('ed$',w)]
通配符“.”可以用来匹配任何单个字符。例如:有一个8个字母组成的字谜,j是第三个字母,t的第六个字母,每个空白单元格用句点隔开.(^字符串开始,$字符串结束)
[w for w in wordlist if re.search('^..j..t..$',w)]
计算文本中词出现次数 sum(w for w in text if re.search('^e-?mail$',w))
搜索数字
[w for w in wordlist if re.search('^[0-9]+\.[0-9]+$',w)]
[w for w in wordlist if re.search('^[0-9]{4}$',w)]
python正则表达式基本元字符
- . 通配符,匹配所有字符
- ^abc 匹配以abc开始的字符串
- abc$ 匹配以abc结尾的字符串
- [abc] 匹配字符集合
- [A-Z0-9] 匹配字符范围
- ed|ing|s 匹配指定的字符串,诸如ed或者ing或者s
- * 前面项目0个或者多个,如a*/[a-z]* (也叫Kleene闭包)
- + 前面项目1个或者多个,如a+、[a-z]+
- ? 前面项目0个或者1个,如a?、[a-z]?
- {n} 重复n次
- {n,} 至少重复n次
- {,n} 重复不多于n次
- {m,n} 至少重复m次不多于n次
- a(b|c)+ 括号表示操作符的范围
- 正则表达式符号:
- \b 词边界
- \d 任何数字等于[0-9]
- \D 任何非数字等于[^0-9]
- \s 任何空白字符[\t\n\r\f\v]
- \S 任何非空白字符[^\t\n\r\f\v]
- \w 任何字母[A-Za-z0-9]
- \W 任何非字母[^A-Za-z0-9]
- \t 制表符
- \n 换行符
指定条件查询分析:
>>> f=codecs.open(r"E:\dict\q0.txt",'r').read()
>>> import re
>>> re.findall(r"大秦",f)
['大秦']
>>> re.findall(r"庞涓",f)
['庞涓', '庞涓', '庞涓', '庞涓', '庞涓', '庞涓', '庞涓', '庞涓', '庞涓', '庞涓', '庞涓', '庞涓', '庞涓', '庞涓', '庞涓', '庞涓', '庞涓', '庞涓', '庞涓', '庞涓', '庞涓', '庞涓', '庞涓', '庞涓', '庞涓', '庞涓', '庞涓', '庞涓', '庞涓', '庞涓', '庞涓', '庞涓', '庞涓']
>>> len(re.findall(r"庞涓",f))
33
>>>
【推荐】
【NLP】Python NLTK处理原始文本的更多相关文章
- 【NLP】干货!Python NLTK结合stanford NLP工具包进行文本处理
干货!详述Python NLTK下如何使用stanford NLP工具包 作者:白宁超 2016年11月6日19:28:43 摘要:NLTK是由宾夕法尼亚大学计算机和信息科学使用python语言实现的 ...
- 【NLP】Python NLTK获取文本语料和词汇资源
Python NLTK 获取文本语料和词汇资源 作者:白宁超 2016年11月7日13:15:24 摘要:NLTK是由宾夕法尼亚大学计算机和信息科学使用python语言实现的一种自然语言工具包,其收集 ...
- [转]【NLP】干货!Python NLTK结合stanford NLP工具包进行文本处理 阅读目录
[NLP]干货!Python NLTK结合stanford NLP工具包进行文本处理 原贴: https://www.cnblogs.com/baiboy/p/nltk1.html 阅读目录 目 ...
- 【NLP】Python NLTK 走进大秦帝国
Python NLTK 走进大秦帝国 作者:白宁超 2016年10月17日18:54:10 摘要:NLTK是由宾夕法尼亚大学计算机和信息科学使用python语言实现的一种自然语言工具包,其收集的大量公 ...
- Python NLTK 自然语言处理入门与例程(转)
转 https://blog.csdn.net/hzp666/article/details/79373720 Python NLTK 自然语言处理入门与例程 在这篇文章中,我们将基于 Pyt ...
- Python网络01 原始Python服务器
原文:Python网络01 原始Python服务器 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 之前我的Python教程中有人 ...
- 重磅︱R+NLP:text2vec包——New 文本分析生态系统 No.1(一,简介)
每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 词向量的表示主流的有两种方式,一种当然是耳熟能 ...
- [Python] 糗事百科文本数据的抓取
[Python] 糗事百科文本数据的抓取 源码 https://github.com/YouXianMing/QiuShiBaiKeText import sqlite3 import time im ...
- Python+selenium之获取文本值和下拉框选择数据
Python+selenium之获取文本值和下拉框选择数据 一.结合实例进行描述 1. 实例如下所示: #新增标签操作 def func_labels(self): self.driver.find_ ...
随机推荐
- C#异步编程(一)
异步编程简介 前言 本人学习.Net两年有余,是第一次写博客,虽然写的很认真,当毕竟是第一次,肯定会有很多不足之处, 希望大家照顾照顾新人,有错误之处可以指出来,我会虚心接受的. 何谓异步 与同步相对 ...
- solr服务中集成IKAnalyzer中文分词器、集成dataimportHandler插件
昨天已经在Tomcat容器中成功的部署了solr全文检索引擎系统的服务:今天来分享一下solr服务在海量数据的网站中是如何实现数据的检索. 在solr服务中集成IKAnalyzer中文分词器的步骤: ...
- 浅谈 Fragment 生命周期
版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Fragment 文中如有纰漏,欢迎大家留言指出. Fragment 是在 Android 3.0 中 ...
- 实时的.NET程序错误监控产品Exceptionless
Exceptionless可以对ASP.NET, Web API, WebForms, WPF, Console, 和 MVC 应用提供错误监控.上传.报表服务.使用时需要在Exceptionless ...
- Hello Web API系列教程——Web API与国际化
软件国际化是在软件设计和文档开发过程中,使得功能和代码设计能处理多种语言和文化习俗,在创建不同语言版本时,不需要重新设计源程序代码的软件工程方法.这在很多成熟的软件开发平台中非常常见.对于.net开发 ...
- transtion:过渡动画
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 17.0px Monaco; color: #4f5d66 } p.p2 { margin: 0.0px 0 ...
- Centos 下 mysql root 密码重置
重置mysql密码的方法有很多,官网也提供了很方便的快捷操作办法,可参考资料 resetting permissions .本文重置密码的具体步骤如下: 一.停止MySQL(如果处于运行状态) #se ...
- C# 数组的交集、差集、并集
C# 数组的交集.差集.并集 工作中经常会用这方面的知识来检查那些字段是必须输入的,那些是禁止输入. using System; using System.Collections.Generic; u ...
- 《MySQL必知必会》学习笔记
数据库:数据库是一种以某种有组织的方式存储的数据集合.其本质就是一个容器,通常是一个或者一组文件. 表:表示一种结构化的文件,可用来存储某种特定类型的数据. 模式:描述数据库中特定的表以及整个数据库和 ...
- 1 selenium3.0.1无法打开火狐浏览器
[问题描述] 1.配置selenium3.0和java后,尝试打开火狐浏览器,提示缺少geckodriver驱动. [解决方案] 1.在http://www.seleniumhq.org/downlo ...