文章目录
- 访问文本
- @字符串处理
- @编码
- @正则表达式
- 分词
- @正则表达式分词(不好)
- Tokenize命令
- @自定义函数
- 规范化文本
- 将文本转换为小写
- 查找词干
- @自定义函数(不好)
- NLTK词干提取器
- Porter
- Lancaster
- Snowball
- 词形还原
访问文本
方法一:
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)
strip() 方法删除输入行结尾的换行符
@字符串处理
有用的字符串方法:
方法 功能
s.find(t) 字符串s中包含t的第一个索引(没找到返回(-1)
s.rfind(t) 字符串s中包含t的最后一个索引(没找到返回-1)
s.index(t) 与s.find(t)功能类似,但没找到时引起ValueError
s.rindex(t) 与s.rfind(t)功能类似,但没找到时引起ValueError
s.join(text) 使用s连接text中的文本为一个字符串
s.split(t) 在所有找到t的位置将s分割成列表(默认为空白符)
s.splitlines() 将s按行分割成字符串列表
s.lower() 小写版本的字符串s
s.upper() 大写版本的字符串s
s.title() 首字母大写版本的字符串s
s.strip() s不带前导或尾随空格的副本
s.replace(t, u) 用u替换s中的t
@编码
path = nltk.data.find('corpora/unicode_samples/polish-lat2.txt')
f = open(path, encoding='latin2')
for line in f:
line = line.strip()
print(line)
encode()
@正则表达式
re.findall()只是给我们后缀。这是因为括号有第二个功能:选择要提取的子字符串。
如果我们要使用括号来指定析取的范围,但不想选择要输出的字符串,必须添加?:
r在字符串之前表示防止转义
在Python中使用正则表达式,需要使用import re导入re库。
re.search(p, s) 检查字符串s中是否有模式p(只匹配到一项)
re.findall() 找出指定正则表达式的所有匹配
search()函数从全部内容匹配,如果有多个,找到第一个匹配的
findall()函数从全部内容匹配,如果有多个,找出所有匹配的
word = 'supercalifragilisticexpialidocious'
re.findall(r'[aeiou]', word)
#['u', 'e', 'a', 'i', 'a', 'i', 'i', 'i', 'e', 'i', 'a', 'i', 'o', 'i', 'o', 'u']
re.sub() 替换
sub()的第一个参数是要匹配的模式,第二个参数是要替换上的模式。
#使用示例:把日期格式从'09/30/2018'转换成'2018-09-30'
text = 'Today is 9/30/2018. PyCon starts 3/13/2013.'
re.sub(r'(\d+)/(\d+)/(\d+)', r'\3-\1-\2', text)
# 'Today is 2018-9-30. PyCon starts 2013-3-13.'
正则表达式基本元字符,其中包括通配符,范围和闭包
操作符 行为
. 通配符,匹配所有字符
^abc 匹配以abc开始的字符串
abc$ 匹配以abc结尾的字符串
[abc] 匹配字符集合中的一个
[A-Z0-9] 匹配字符范围中的一个
ed|ing|s 匹配指定的一个字符串(析取)
* 前面的项目零个或多个,例如a*, [a-z]*(也叫Kleene 闭包)
+ 前面的项目1 个或多个,例如a+, [a-z]+
? 前面的项目零个或1 个(即可选),例如a?, [a-z]?
{n} 精确重复n次,n为非负整数
{n,} 至少重复n次
{,n} 重复不多于n次
{m,n} 至少重复m次不多于n次
a(b|c)+ 括号表示操作符的范围
分词
分词是一个比你可能预期的要更为艰巨的任务。没有单一的解决方案能在所有领域都行之有效,我们必须根据应用领域的需要决定哪些是词符。
@正则表达式分词(不好)
raw.split() 在空格符处分割原始文本
注意:在正则表达式前加字母r(表示"原始的"),它告诉Python解释器按照字面表示对待字符串,而不去处理正则表达式中包含的反斜杠字符。
正则表达式符号
符号 功能
\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 换行符
Tokenize命令
raw = """DENNIS: Listen, strange women lying in ponds distributing swords
is no basis for a system of government. Supreme executive power derives from
a mandate from the masses, not from some farcical aquatic ceremony."""
tokens = word_tokenize(raw)
word_tokenize(raw)
@自定义函数
对于一些书写系统,由于没有词的可视边界,文本分词变得更加困难。
根据(Brent, 1995),我们可以定义一个目标函数,一个打分函数,我们将基于词典的大小和从词典中重构源文本所需的信息量尽力优化它的值。
计算目标函数:给定一个假设的源文本的分词(左),推导出一个词典和推导表,它能让源文本重构,然后合计每个词项(包括边界标志)与推导表的字符数,作为分词质量的得分;得分值越小表明分词越好。
规范化文本
将文本转换为小写
set(w.lower() for w in text) 通过使用lower()我们将文本规范化为小写
查找词干
@自定义函数(不好)
def stem(word):
for suffix in ['ing', 'ly', 'ed', 'ious', 'ies', 'ive', 'es', 's', 'ment']:
if word.endswith(suffix):
return word[:-len(suffix)]
return word
去掉看起来像后缀的词
NLTK词干提取器
Porter
nltk.PorterStemmer()
porter = nltk.PorterStemmer()
[porter.stem(t) for t in tokens]
#['DENNI', ':', 'Listen', ',', 'strang', 'women', 'lie', 'in', 'pond',
'distribut', 'sword', 'is', 'no', 'basi', 'for', 'a', 'system', 'of', 'govern',
'.', 'Suprem', 'execut', 'power', 'deriv', 'from', 'a', 'mandat', 'from',
'the', 'mass', ',', 'not', 'from', 'some', 'farcic', 'aquat', 'ceremoni', '.']
Lancaster
nltk.LancasterStemmer()
lancaster = nltk.LancasterStemmer()
[lancaster.stem(t) for t in tokens]
#['den', ':', 'list', ',', 'strange', 'wom', 'lying', 'in', 'pond', 'distribut',
'sword', 'is', 'no', 'bas', 'for', 'a', 'system', 'of', 'govern', '.', 'suprem',
'execut', 'pow', 'der', 'from', 'a', 'mand', 'from', 'the', 'mass', ',', 'not',
'from', 'som', 'farc', 'aqu', 'ceremony', '.']
Snowball
SnowballStemmer()
from nltk.stem import SnowballStemmer
snowball_stemmer = SnowballStemmer(“english”)
snowball_stemmer.stem(‘maximum’)
Porter 和Lancaster 词干提取器按照它们自己的规则剥离词缀。请看Porter词干提取器正确处理了词lying(将它映射为lie),而Lancaster词干提取器并没有处理好。
词干提取过程没有明确定义,我们通常选择心目中最适合我们的应用的词干提取器。如果你要索引一些文本和使搜索支持不同词汇形式的话,Porter词干提取器是一个很好的选择.
词形还原
WordNet为我们提供了稳健的词形还原的函数
要求手动注明词性,否则可能会有问题。因此一般先要分词、词性标注,再词性还原。
WordNetLemmatizer()
wnl.lemmatize() 函数可以进行词形还原,第一个参数为单词,第二个参数为该单词的词性
from nltk.stem import WordNetLemmatizer
wnl = WordNetLemmatizer()
#lemmatize nouns
print(wnl.lemmatize('men', 'n'))
#lemmatize verbs
print(wnl.lemmatize('ate', 'v'))
#lemmatize adjectives
print(wnl.lemmatize('saddest', 'a'))
men
eat
sad