Python自然语言处理-学习笔记(3) —— 处理原始文本、正则表达式学习

nltk常用函数学习

import nltk
函数用法解释
word_tokenize(raw)分词,用于产生词汇和标点符号的链表
sent_tokenize(raw)分词,用于产生句子的链表
text = Text(raw)按字符分词,包括空格;或者将分好的词转换为nltk文本格式
raw.find(str) 、raw.rfind(str)分别在raw中从正向、反向找str的首字符索引值
text.findall(regexp)对nltk分好的词做模式匹配,返回所有和正则表达式匹配的子串,若有()子串只返回()里的内容
re_show(regexp,string,left=’{‘,right=’})用指定的left和right标注所有匹配regexp的地方
Index((word,i) for (word,i) in enumerate(raw))返回key为word,value为位置列表的字典
PorterStemmer().stem(word)Porter词干提取,删除后缀
LancasterStemmer().stem(word)Lancaster词干提取,删除后缀
WordNetLemmatizer().lemmatize(word)词形归并,删除后缀并检查是否在词典中,速度比词干提取慢
re.split(regexp,raw)用正则表达式为文本分词
nltk.data.load(‘tokenizers/punkt/english.pickle’)Punkt句子分割器,断句

从网络和硬盘中访问文本

处理HTML

from from urllib.request import urlopen
from bs4 import BeautifulSoup
import nltk
html = urlopen(url).read()
raw = BeautifulSoup(html).get_text()

处理RSS订阅

from feedparser import parse
llog = parse("http://languagelog.ldc.upenn.edu/nll/?feed=atom")

读取本地文件

raw = open(filepath).read()

nltk语料库文件可以通过文件名来查找路径:

path = nltk.data.find('corpora/gutenberg/melville-moby_dick.txt')
raw = open(path).read()

打开指定编码的文件

import codecs
f = codece.open(path,encoding='latin2')

正则表达式学习

正则表达式速查表
import re

函数用法解释
search(regexp,word)正则表达式regexp是否匹配单词word,返回True或False
findall(regexp,word)在单词中找到所有匹配的正则表达式,返回List
regexp_tokenize(text, regexp)功能类似于findall,效率更高
sub(regexp,str,text)将文本中匹配正则表达式的部分替换为str
词干提取器

两种词干提取器:
这里写图片描述
这里写图片描述
使用词干提取器索引文本:

class IndexedText(object):
    def __init__(self,stemmer,text,fileid):
        self._text = text.words(fileid)  #分词处理
        self._stemmer = stemmer  #词干提取器
        self._index = Index((self._stem(word),i) for (i,word) in enumerate(self._text))
        self._nw = round(len(text.raw(fileid))/len(self._text))  #平均词长
    #寻找word 指定宽度的上下文
    def concordance(self,word,width=40):
        key = self._stem(word)
        wc = width // self._nw   #单词个数
        for i in self._index[key]:
            lcontext = ' '.join(self._text[i-wc:i])
            rcontext = ' '.join(self._text[i:i+wc])
            ldisplay = '%*s' % (width,lcontext[-width:])
            rdisplay = '%-*s' % (width,rcontext[:width])
        print(ldisplay,rdisplay)
    def _stem(self,word):
        return self._stemmer.stem(word).lower()

输出结果:

正则表达式中的?:到底是什么意思?

这里写图片描述
在re正则表达式中,用于()不捕获分组 原文

还有一种说法是,匹配pattern但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用或字符“(|)”来组合一个模式的各个部分是很有用。例如”industr(?:y|ies)”就是一个比”industry|industries”更简略的表达式。

test = 'industryindustries-have.has'
re.findall(r'industr(?:y|ies)|ha(?:ve|s)',test)

结果为

['industry', 'industries', 'have', 'has']

在正则表达式分词器中使用?:
这里写图片描述

*?和*的区别,有什么作用?

*是贪婪的,尽可能多地匹配字符串,*?是非贪婪的。
例如:
这里写图片描述

?!是什么意思

(?!pattern) 正向否定预查,在任何不匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如r“Windows(?!95|98|NT|2000)”能匹配“Windows3.1”中的“Windows”,但不能匹配“Windows2000”中的“Windows”

关于\b

\b是单词边界,匹配空白字符的位置,并不匹配空白字符本身 原文
\b \b就是你在匹配单词的时候,如果不是整个单词就不匹配

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值