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就是你在匹配单词的时候,如果不是整个单词就不匹配