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)

关于处理原始文本部分导入语句:

  1. >>> from __future__ import division
  2. >>> import nltk,re,pprint

1 从网络和硬盘访问文本(在线获取伤寒杂病论)


python网络访问程序:

  1. >>> from __future__ import division
  2. >>> import nltk,re,pprint
  3. >>> from urllib.request import urlopen
  4. >>> url=r'http://www.gutenberg.org/files/24272/24272-0.txt'
  5. >>> raw=urlopen(url).read()
  6. >>> raw = raw.decode('utf-8')
  7. >>> len(raw)
  8. 70306
  9. >>> raw[2000:2500]

运行结果:

对其中文分词:

  1. >>> from nltk.tokenize import StanfordSegmenter
  2. >>> segmenter = StanfordSegmenter(
  3. path_to_jar=r"E:\tools\stanfordNLTK\jar\stanford-segmenter.jar",
  4. path_to_slf4j=r"E:\tools\stanfordNLTK\jar\slf4j-api.jar",
  5. path_to_sihan_corpora_dict=r"E:\tools\stanfordNLTK\jar\data/",
  6. path_to_model=r"E:\tools\stanfordNLTK\jar\data\pku.gz",
  7. path_to_dict=r"E:\tools\stanfordNLTK\jar\data\dict-chris6.ser.gz"
  8. )
  9. >>> result = segmenter.segment(raw)
  10. >>> result[1000:2500]

分词结果:

2 在线获取处理HTML文本(红楼梦)


在线获取html文本资料:

  1. >>> import re,nltk
  2. >>> from urllib.request import urlopen
  3. >>> url='http://www.gutenberg.org/cache/epub/24264/pg24264-images.html'
  4. >>> html=urlopen(url).read()
  5. >>> html=html.decode('utf-8')
  6. >>> html[5000:5500]

运行结果:

相关正则知识:

  1. \d  匹配一个数字
  2. \w 匹配一个字母或者数字
  3. *  任意个字符(包括0个),
  4. +  至少一个字符
  5. ?  0个或1个字符
  6. {n} n个字符
  7. {n,m} n-m个字符
  8. \s 匹配一个空格
  9. \s+ 至少有一个空格
  10. \d{3,8} 表示3-8个数字,例如'1234567'
  11. \d{3}\s+\d{3,8}
  12. [0-9a-zA-Z\_] 匹配一个数字、字母或者下划线
  13. [0-9a-zA-Z\_]+ 匹配至少由一个数字、字母或者下划线组成的字符串,
  14. 比如'a100','0_Z','Py3000'等等;
  15. [a-zA-Z\_][0-9a-zA-Z\_]*可以匹配由字母或下划线开头,后接任意个由一个数字、字母或者下划线组成的字符串,也就是Python合法的变量
  16. [a-zA-Z\_][0-9a-zA-Z\_]{0, 19}更精确地限制了变量的长度是1-20个字符(前面1个字符+后面最多19个字符)
  17. A|B可以匹配A或B,所以(P|p)ython可以匹配'Python'或者'python'
  18. ^表示行的开头,^\d表示必须以数字开头
  19. $表示行的结束,\d$表示必须以数字结束

正则表达式进行数据清洗:

  1. >>> len(html)
  2. 962651
  3. >>> strhtml=re.sub("[\s+\.\!\/_,$%^*(+\"\']+|[+——!,。??、~@#¥%……&*()]+|[A-Za-z0-9]+","",html)#去掉中英文符号
  4. >>> len(strhtml)
  5. 781150
  6. >>> strhtml[5000:5500]

清洗后结果:

红楼梦进行中文分词

  1. >>> # 红楼梦进行中文分词
  2. >>> from nltk.tokenize import StanfordSegmenter
  3. >>> segmenter = StanfordSegmenter(
  4. path_to_jar=r"E:\tools\stanfordNLTK\jar\stanford-segmenter.jar",
  5. path_to_slf4j=r"E:\tools\stanfordNLTK\jar\slf4j-api.jar",
  6. path_to_sihan_corpora_dict=r"E:\tools\stanfordNLTK\jar\data/",
  7. path_to_model=r"E:\tools\stanfordNLTK\jar\data\pku.gz",
  8. path_to_dict=r"E:\tools\stanfordNLTK\jar\data\dict-chris6.ser.gz"
  9. )
  10. >>> result = segmenter.segment(raw)

查找分析:查找“曰”后面的内容

  1. re.findall(r'(曰.{,3})',strhtml)

备注:处理搜索引擎的结果:基于自己配置的搜索引擎处理

3 处理RSS订阅


  1. >>> import feedparser #feedparser需要在python库中下载
  2. >>> llog=feedparser.parse(url)

4 读取本地文件:strip()方法删除输入行结尾的换行符


方法一:

  1. >>> f=open(r"E:\dict\q0.txt","r")
  2. >>> for line in f:
  3. print(line.strip())

方法二:

  1. >>> with open(r"C:\Users\cuitbnc\Desktop\dqdg.txt","r+") as f:
  2. str=f.read()

方法三:

  1. >>> import nltk
  2. >>> path=nltk.data.find(r'C:\Users\cuitbnc\Desktop\dqdg.txt')
  3. >>> raw=open(path,'rU').read()
  4. >>> len(raw)
  5. 673167
  6. >>>

PDF或者MSWord以及其他二进制提取文本,利用第三方函数库pypdf和pywin32

  1. >>> raw=open(r"E:\dict\q0.txt","r").read()
  2. >>> tokens=nltk.word_tokenize(raw)
  3. >>> words=[w for w in tokens]
  4. >>> vocab=sorted(set(words))
  5. >>> 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转化为合适的编码,这个过程就是编码

中文解码问题

  1. >>> raw=open(r"E:\dict\text.txt","r").read()
  2. Traceback (most recent call last):
  3. File "<pyshell#18>", line 1, in <module>
  4. raw=open(r"E:\dict\text.txt","r").read()
  5. UnicodeDecodeError: 'gbk' codec can't decode byte 0x80 in position 16: illegal multibyte sequence
  6. >>> import codecs
  7. >>> f=codecs.open(r"E:\dict\text.txt",'r',encoding="utf-8").read()

ord()查找字符的整数序列

  1. >>> ord('a')
  2. 97
  3. >>> ord('f')
  4. 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正则表达式基本元字符

  1. .   通配符,匹配所有字符
  2. ^abc  匹配以abc开始的字符串
  3. abc$  匹配以abc结尾的字符串
  4. [abc]  匹配字符集合
  5. [A-Z0-9] 匹配字符范围
  6. ed|ing|s 匹配指定的字符串,诸如ed或者ing或者s
  7. *   前面项目0个或者多个,如a*/[a-z]* (也叫Kleene闭包)
  8. +   前面项目1个或者多个,如a+、[a-z]+
  9. ?   前面项目0个或者1个,如a?、[a-z]?
  10. {n}   重复n次
  11. {n,}  至少重复n次
  12. {,n}  重复不多于n次
  13. {m,n}  至少重复m次不多于n次
  14. a(b|c)+  括号表示操作符的范围
  15. 正则表达式符号:
  16. \b 词边界
  17. \d 任何数字等于[0-9]
  18. \D 任何非数字等于[^0-9]
  19. \s 任何空白字符[\t\n\r\f\v]
  20. \S 任何非空白字符[^\t\n\r\f\v]
  21. \w 任何字母[A-Za-z0-9]
  22. \W 任何非字母[^A-Za-z0-9]
  23. \t 制表符
  24. \n 换行符

指定条件查询分析:

  1. >>> f=codecs.open(r"E:\dict\q0.txt",'r').read()
  2. >>> import re
  3. >>> re.findall(r"大秦",f)
  4. ['大秦']
  5. >>> re.findall(r"庞涓",f)
  6. ['庞涓', '庞涓', '庞涓', '庞涓', '庞涓', '庞涓', '庞涓', '庞涓', '庞涓', '庞涓', '庞涓', '庞涓', '庞涓', '庞涓', '庞涓', '庞涓', '庞涓', '庞涓', '庞涓', '庞涓', '庞涓', '庞涓', '庞涓', '庞涓', '庞涓', '庞涓', '庞涓', '庞涓', '庞涓', '庞涓', '庞涓', '庞涓', '庞涓']
  7. >>> len(re.findall(r"庞涓",f))
  8. 33
  9. >>>

【推荐】

  1. 古滕堡语料库
  2. 语料库在线
  3. 搜狗实验室新闻|互联网数据
  4. 北京大学语言研究中心
  5. 计算机语言研究所
  6. 数据堂

【NLP】Python NLTK处理原始文本的更多相关文章

  1. 【NLP】干货!Python NLTK结合stanford NLP工具包进行文本处理

    干货!详述Python NLTK下如何使用stanford NLP工具包 作者:白宁超 2016年11月6日19:28:43 摘要:NLTK是由宾夕法尼亚大学计算机和信息科学使用python语言实现的 ...

  2. 【NLP】Python NLTK获取文本语料和词汇资源

    Python NLTK 获取文本语料和词汇资源 作者:白宁超 2016年11月7日13:15:24 摘要:NLTK是由宾夕法尼亚大学计算机和信息科学使用python语言实现的一种自然语言工具包,其收集 ...

  3. [转]【NLP】干货!Python NLTK结合stanford NLP工具包进行文本处理 阅读目录

    [NLP]干货!Python NLTK结合stanford NLP工具包进行文本处理  原贴:   https://www.cnblogs.com/baiboy/p/nltk1.html 阅读目录 目 ...

  4. 【NLP】Python NLTK 走进大秦帝国

    Python NLTK 走进大秦帝国 作者:白宁超 2016年10月17日18:54:10 摘要:NLTK是由宾夕法尼亚大学计算机和信息科学使用python语言实现的一种自然语言工具包,其收集的大量公 ...

  5. Python NLTK 自然语言处理入门与例程(转)

    转 https://blog.csdn.net/hzp666/article/details/79373720     Python NLTK 自然语言处理入门与例程 在这篇文章中,我们将基于 Pyt ...

  6. Python网络01 原始Python服务器

    原文:Python网络01 原始Python服务器 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 之前我的Python教程中有人 ...

  7. 重磅︱R+NLP:text2vec包——New 文本分析生态系统 No.1(一,简介)

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 词向量的表示主流的有两种方式,一种当然是耳熟能 ...

  8. [Python] 糗事百科文本数据的抓取

    [Python] 糗事百科文本数据的抓取 源码 https://github.com/YouXianMing/QiuShiBaiKeText import sqlite3 import time im ...

  9. Python+selenium之获取文本值和下拉框选择数据

    Python+selenium之获取文本值和下拉框选择数据 一.结合实例进行描述 1. 实例如下所示: #新增标签操作 def func_labels(self): self.driver.find_ ...

随机推荐

  1. HTML渲染过程详解

    无意中看到寒冬关于前端的九个问题,细细想来我也只是对第一.二.九问有所了解,正好也趁着这个机会梳理一下自己的知识体系.由于本人对http协议以及dns对url的解析问题并不了解,所以这里之探讨url请 ...

  2. 使用SwingBench 对Oracle RAC DB性能 压力测试

    我们可以使用swingbench这个工具对数据库性能进行压力测试,得到一些性能指标作为参考. SwingBench下载: http://www.dominicgiles.com/downloads.h ...

  3. 代码的坏味道(19)——狎昵关系(Inappropriate Intimacy)

    坏味道--狎昵关系(Inappropriate Intimacy) 特征 一个类大量使用另一个类的内部字段和方法. 问题原因 类和类之间应该尽量少的感知彼此(减少耦合).这样的类更容易维护和复用. 解 ...

  4. jdb调试scala代码的简单介绍

    在linux调试C/C++的代码需要通过gdb,调试java代码呢?那就需要用到jdb工具了.关于jdb的用法在网上大家都可以找到相应的文章,但是对scala进行调试的就比较少了.其实调试的大致流程都 ...

  5. Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory

    学习架构探险,从零开始写Java Web框架时,在学习到springAOP时遇到一个异常: "C:\Program Files\Java\jdk1.7.0_40\bin\java" ...

  6. 创建ABPboilerplate模版项目

    本文是根据角落的白板报的<通过ABPboilerplate模版创建项目>一文的学习总结,感谢原文作者角落的白板报. 1 准备 开发环境: Visual Studio 2015 update ...

  7. RMS去除在线认证

    在微软 OS 平台创建打开 RMS 文档如何避免时延 相信我们在企业内部的环境中已经部署了微软最新的OS平台,Windows 7和Windows 2008 R2,在这些OS平台上使用IRM功能时,您有 ...

  8. Linux学习笔记(一):常用命令

    经过统计Linux中能够识别的命令超过3000种,当然常用的命令就远远没有这么多了,按照我的习惯,我把已经学过的Linux常用命令做了以下几个方面的分割: 1.文件处理命令 2.文件搜索命令 3.帮助 ...

  9. Hello bokeyuan!

    一个学习技术的年轻人 从2016/09/03进入大学学习计算机科学与技术这门学科,我已经学习了4个月了,大学的生活很枯燥,很麻烦,很多事,与我想象中的大学有很大的区别.但是这都不会影响我想要成为一个技 ...

  10. bzoj1531: [POI2005]Bank notes

    Description Byteotian Bit Bank (BBB) 拥有一套先进的货币系统,这个系统一共有n种面值的硬币,面值分别为b1, b2,..., bn. 但是每种硬币有数量限制,现在我 ...