前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python NLTK 处理原始文本

Python NLTK 处理原始文本

作者头像
机器学习AI算法工程
发布2018-03-14 16:58:10
1.4K0
发布2018-03-14 16:58:10
举报
文章被收录于专栏:机器学习AI算法工程

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

代码语言:javascript
复制
>>> from __future__ import division
>>> import nltk,re,pprint

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


python网络访问程序:

代码语言:javascript
复制
>>> 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]

运行结果:

对其中文分词:

代码语言:javascript
复制
>>> 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文本资料:

代码语言:javascript
复制
>>> 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]

运行结果:

相关正则知识:

  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
  20. 表示必须以数字结束

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

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

清洗后结果:

红楼梦进行中文分词

代码语言:javascript
复制
>>> # 红楼梦进行中文分词
>>> 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)

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

代码语言:javascript
复制
re.findall(r'(曰.{,3})',strhtml)

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

3 处理RSS订阅


代码语言:javascript
复制
>>> import feedparser #feedparser需要在python库中下载
>>> llog=feedparser.parse(url)

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


方法一:

代码语言:javascript
复制
>>> f=open(r"E:\dict\q0.txt","r")
>>> for line in f:
    print(line.strip())

方法二:

代码语言:javascript
复制
>>> with open(r"C:\Users\cuitbnc\Desktop\dqdg.txt","r+") as f:
    str=f.read()

方法三:

代码语言:javascript
复制
>>> 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

代码语言:javascript
复制
>>> 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转化为合适的编码,这个过程就是编码

中文解码问题

代码语言:javascript
复制
>>> 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()查找字符的整数序列

代码语言:javascript
复制
>>> ord('a')
97
>>> ord('f')
102

7 使用正则表达式检测词组搭配


import re 导入re函数库

re.search('ed′,w)查询w字符串中是都ed结尾匹配[wforwinwordlistifre,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 换行符

指定条件查询分析:

代码语言:javascript
复制
>>> 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
>>>
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2016-12-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大数据挖掘DT数据分析 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 从网络和硬盘访问文本(在线获取伤寒杂病论)
  • 2 在线获取处理HTML文本(红楼梦)
  • 3 处理RSS订阅
  • 4 读取本地文件:strip()方法删除输入行结尾的换行符
  • 5 字符串:最底层的文本处理
  • 6 使用Unicode进行文字处理
  • 7 使用正则表达式检测词组搭配
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档