现在的位置: 首页 > 综合 > 正文

python自然语言处理学习笔记第三章2

2014年07月26日 ⁄ 综合 ⁄ 共 5958字 ⁄ 字号 评论关闭

为了读取本地文件,我们需要使用Python 内置的open()函数,然后是read()方法。

另一个你在访问一个文本文件时可能遇到的问题是换行的约定,这个约定因操作系统不
同而不同。内置的open()函数的第二个参数用于控制如何打开文件.。'r'意味着以只读方式打开文件(默认),'U'表示“通用”,它让我们忽略不同的换
行约定。

>>> f = open('C:\pythonfile\document.txt','rU')
>>> f.read()
'document.txtcvzxfdsgasdgacvxcvzxc\nsdfsdfasgasdfgasdfgasd\ndfgaergafgadfads\nrsdfasgafgasfg\ndsfasdfsfaefgae\nxcvzxcvzvasd\ncxvzxcvzxcvz\n'
>>> for line in f:
print line.strip()


>>> f.close()
>>> f = open('C:\pythonfile\document.txt','rU')
>>> for line in f:
print line.strip()    //我们使用strip()方法删除输入行结尾的换行符。


document.txtcvzxfdsgasdgacvxcvzxc
sdfsdfasgasdfgasdfgasd
dfgaergafgadfads
rsdfasgafgasfg
dsfasdfsfaefgae
xcvzxcvzvasd
cxvzxcvzxcvz

用NLTK的方式读取

>>> path = nltk.data.find('C:\pythonfile\document.txt')
>>> raw = open(path,'rU').read()

>>> raw
'document.txtcvzxfdsgasdgacvxcvzxc\nsdfsdfasgasdfgasdfgasd\ndfgaergafgadfads\nrsdfasgafgasfg\ndsfasdfsfaefgae\nxcvzxcvzvasd\ncxvzxcvzxcvz\n'

对pdf word文件的处理:

 

对字符串的操作

>>> monty = 'monty python'
>>> grail = 'holy grail'
>>> print monty + grail
monty pythonholy grail
>>> print monty,grail
monty python holy grail

>>> print monty,"hello",grail
monty python hello holy grail

>>> monty[-1]
'n'

 

 

这段代码按照出现频率最高排在最先的顺序显示出英文字母。

>>> import nltk
>>> from nltk.corpus import gutenberg
>>> raw = gutenberg.raw('melville-moby_dick.txt')
>>> fdist = nltk.FreqDist(ch.lower() for ch in raw if ch.isalpha())
>>> fdisk.keys()

Traceback (most recent call last):
  File "<pyshell#11>", line 1, in <module>
    fdisk.keys()
NameError: name 'fdisk' is not defined
>>> fdist.keys()
['e', 't', 'a', 'o', 'n', 'i', 's', 'h', 'r', 'l', 'd', 'u', 'm', 'c', 'w', 'f', 'g', 'p', 'b', 'y', 'v', 'k', 'q', 'j', 'x', 'z']

 

字符串的倒序是从1开始的,顺序是从零开始的。

>>> monty[6:10]
'pyth'
>>> monty[-12:-7]
'monty'

 

字符串处理函数总结:

 一旦你创建了一个字符串,就不能改变它。然而,链表是可变的,其内容可以随时修改。作为一个结论,链表支持修改原始值的操作,而不是产生一个新的值。

Unicode 支持超过一百万种字符。每个字符分配一个编号,称为编码点。在Python 中,
编码点写作\uXXXX 的形式,其中XXXX 是四位十六进制形式数。

文件中的文本都是有特定编码的,所以我们需要一些机制来将文本翻译成Unicode——
翻译成Unicode 叫做解码。相对的,要将Unicode 写入一个文件或终端,我们首先需要将U
nicode 转化为合适的编码——这种将Unicode 转化为其它编码的过程叫做编码,

请注意我们可以使用f = codecs.open(path, 'w', encoding='utf-8')写入Unicode 编码数据到一个文件。
从文件对象f 读出的文本将以Unicode 返回。正如我们较早前指出的,要在终端上查看这个文本,我们需要使用合适的编码对它进行编码
Python 特定的编码unicode_escape是一个虚拟的编码,它把所有非ASCII 字符转换成它们的\uXXXX 形式。编码点在ASCII码0-127 的范围以外但低于256 的使用两位数字的形式\xXX 表示。Python 的codecs 模块提供了将编码数据读入为Unicode 字符串和将Unicode 字符串以
编码形式写出的函数。codecs.open()函数有一个encoding 参数来指定被读取或写入的文件的编码。在Python 中,一个Unicode 字符串常量可以通过在字符串常量前面加一个u 也就是u'hello'来指定。任意Unicode 字符通过在Unicode 字符串常量内使用\uXXXX 转义序列来定义。我们使用ord()查找一个字符的整数序数。
97 的十六进制四位数表示是0061,所以我们可以使用相应的转义序列定义一个Unicode 字符串常量。

>>> import nltk, re, pprint
>>> from __future__ import division
>>> path = nltk.data.find('corpora/unicode_samples/polish-lat2.txt')
>>> import codecs
>>> f = codecs.open(path, encoding='latin2')   //以latin2的unicode编码格式打开文件
>>> for line in f:
 line = line.strip()
 print line.encode('unicode_escape')   //以python默认显示编码格式表示数据。

 
Pruska Biblioteka Pa\u0144stwowa. Jej dawne zbiory znane pod nazw\u0105
"Berlinka" to skarb kultury i sztuki niemieckiej. Przewiezione przez
Niemc\xf3w pod koniec II wojny \u015bwiatowej na Dolny \u015al\u0105sk, zosta\u0142y
odnalezione po 1945 r. na terytorium Polski. Trafi\u0142y do Biblioteki
Jagiello\u0144skiej w Krakowie, obejmuj\u0105 ponad 500 tys. zabytkowych
archiwali\xf3w, m.in. manuskrypty Goethego, Mozarta, Beethovena, Bacha.
>>> ord('a')
97
>>> a=u'\u0061'
>>> a
u'a'
>>> print a
a
>>> nacute = u'\u0114'
>>> nacute
u'\u0114'
>>> nacute_utf = nacute.encode('utf8')   //转换成utf8格式的字符。
>>> print nacute_utf

>>> nacute = u'\u0114'
>>> nacute
u'\u0114'
>>> print nacute   
Ĕ

果你习惯了使用特定的本地编码字符,你可能希望能够在一个Python 文件中使用你
的字符串输入及编辑的标准方法。为了做到这一点,你需要在你的文件的第一行或第二行中
包含字符串:'# -*- coding: <coding>-*-' 。请注意,<coding>是一个像'latin-1','big5'或者'utf-8'的字符串

在Python 中使用正则表达式,需要使用import re 导入re 函数库。

插入符号“^”匹配字符串的开始,就像“$”符号匹配字符串的结尾。
最后,符号“?”表示前面的字符是可选的。因此«^e-?mail $»将匹配email 和e-mail。

。函数re.search(p, s)检查字符串s 中是否有模式p。
,“+”表示的是“前面的项目的一个或多个实例,”它可以是单独的字母如m,可以是一个集合如[fed],可以是一个范围如[d-f]

现在让我们用“*”替换“+”,它表示
“前面的项目的零个或多个实例。”正则表达式«^m*i*n*e*$»将匹配所有我们用«^m+i
+n+e+$»找到的,同时包括其中一些字母不出现的词汇,例如:me、min 和mmmmm。
请注意“+”和“*”符号有时被称为的 Kleene闭包,或者干脆闭包。

运算符“^”当它出现在方括号内的第一个字符位置时有另外的功能。例如:«[^aei
ouAEIOU]»匹配除元音字母之外的所有字母。我们可以搜索NPS 聊天语料库中完全由非元
音字母组成的词汇,使用«^[^aeiouAEIOU]+$»查找诸如:):):)、grrr、cyb3r 和zzzzzzzz
这样的词。请注意其中包含非字母字符。

>>> import re
>>> wordlist = [w for w in nltk.corpus.words.words('en') if w.islower()]

Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    wordlist = [w for w in nltk.corpus.words.words('en') if w.islower()]
NameError: name 'nltk' is not defined
>>> import nltk
>>> wordlist = [w for w in nltk.corpus.words.words('en') if w.islower()]
>>> [w for w in wordlist if re.search('^[ghi][mno][jlk][def]$', w)]
['gold', 'golf', 'hold', 'hole']
>>> chat_words = sorted(set(w for w in nltk.corpus.nps_chat.words()))
>>> [w for w in chat_words if re.search('^m+i+n+e+$', w)]
['miiiiiiiiiiiiinnnnnnnnnnneeeeeeeeee', 'miiiiiinnnnnnnnnneeeeeeee', 'mine', 'mmmmmmmmiiiiiiiiinnnnnnnnneeeeeeee']
>>>

 

 

>>> import nltk
>>> wsj = sorted(set(nltk.corpus.treebank.words()))
>>> [w for w in wsj if re.search('^[0-9]+\.[0-9]+$',w)]
['0.0085', '0.05', '0.1', '0.16', '0.2', '0.25', '0.28', '0.3', '0.4', '0.5', '0.50', '0.54', '0.56', '0.60', '0.7', '0.82', '0.84', '0.9', '0.95', '0.99', '1.01', '1.1', '1.125', '1.14', '1.1650', '1.17', '1.18', '1.19', '1.2', '1.20']

>>> [w for w in wsj if re.search('^[A-Z]+\$$',w)]
['C$', 'US$']

>>> [w for w in wsj if re.search('^[0-9]{4}$', w)]
['1614', '1637', '1787', '1901', '1903', '1917', '1925', '1929', '1933', '1934', '1948', '1953', '1955', '1956', '1961', '1965', '1966', '1967', '1968', '1969', '1970', '1971', '1972', '1973', '1975', '1976', '1977', '1979', '1980', '1981', '1982', '1983',
'1984', '1985', '1986', '1987', '1988', '1989', '1990', '1991', '1992', '1993', '1994', '1995', '1996', '1997', '1998', '1999', '2000', '2005', '2009', '2017', '2019', '2029', '3057', '8300']

>>> [w for w in wsj if re.search('^[0-9]+-[a-z]{3,5}$', w)]
['10-day', '10-lap', '10-year', '100-share', '12-point', '12-year', '14-hour', '15-day', '150-point', '190-point', '20-point', '20-stock', '21-month', '237-seat', '240-page', '27-year', '30-day', '30-point', '30-share', '30-year', '300-day', '36-day', '36-store',
'42-year', '50-state', '500-stock', '52-week', '69-point', '84-month', '87-store', '90-day']

>> [w for w in wsj if re.search('^[a-z]{5,}-[a-z]{2,3}-[a-z]{,6}$', w)]
['black-and-white', 'bread-and-butter', 'father-in-law', 'machine-gun-toting', 'savings-and-loan']

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

抱歉!评论已关闭.