nltk (4)——加⼯原始语料库
加⼯原始语料库
分词
做⾃然语⾔处理,⼀定离不开数据资源,即对数据资源的分析,了解其中潜在的内容。
⽹络上存在众多的资源,如⽂本,⽹页等等。这次写的主要是⽂本和⽹页。
1、我们要使⽤程序获取本地或⽹络上的资源,从⽽使众多的资源成为⾃⼰的资源
2、如何对资源进⾏简单的处理,例如标点符号等等,使⽂本符合我们的要求。
3、编写程序格式化我们想要的输出。
电⼦书查看书中的代码是from urllib import urlopen ,但是在更新的nltk中已经没有这个导⼊了,取⽽代之的是from urllib import request 所以从⽹络中下载电⼦图书并进⾏处理:
英文火星文对⽂本进⾏分词: 书中的原始代码tokens = nltk.word_tokenize(raw)
five hundred miles
但是更新后的nltk,相关的api变了,新的分词为:
此处得到的是⼀个链表,⽂章中说对链表进⾏进⼀步的处理,将链表转换成nltk.Text类型,由此可以进⾏nltk提供的各种⽅法的处理。(⾄
于为什么暂时未搞懂)英语俚语
可以看出来,两种类型还是有⼀定的区别的,转换成Text后就不是list了 当然如果已经将⽂件下载到了本地,python也提供了oi操作,读取本地⽂件。
from urllib import request
url = "www.gutenberg/files/"
raw = request.urlopen(url) #从⽹络中下载电⼦书,转换成纯⽂本的字符串
高中英语课本type(raw)len(raw)
from nltk import tokenize
tokens = tokenize.word_tokenize(raw)
type(tokens) #返回得到是⼀个list 链表
text = nltk.Text(tokens)
type(text)
tokens
text
from nltk import tokenize
file = open('/home/ubuntu/')
raw = ad()
tokens = tokenize.word_tokenize(raw)
text = nltk.Text(tokens)
这样读取了本地的⽂件,完成了上⾯的相关操作。
HTML
很多⾃然语⾔处理都是和⽹页有关的,想要对html进⾏处理,nltk提供了⽅法。
1、使⽤request.openurl() ⽅法获取html
2、将html⽂件读取成⽂本。read()
牛津阅读树3、将html的标签过滤掉nltk.clean_html(html),得到⽆html的⽂本资料。
4、对⽂本进⾏处理。
from urllib import request
from nltk import tokenize
stream = request.urlopen("geek.csdn/news/detail/58565")
html = ad() #读取⽂件成⽂本
raw = nltk.clean_html(html) #过滤html标签
tokens = tokenize.word_tokenize(raw)
text = nltk.Text(tokens)
字符串处理常⽤⽅法
因为在进⾏上⾯的处理是,我们需要对原始字符串进⾏⼀定的处理,所以掌握常见字符串的处理⽅法也是必要的。
stop⽅法功能
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⼩写
commercialize
s.upper()将字符串s⼤写
s.titleca()将字符串s⾸字母⼤写
s.strip()返回⼀个没有⾸尾空⽩字符的S的拷贝
正则表达式使⽤
在⾃然语⾔处理的初始阶段,对原始语料进⾏处理时,正则表达式的使⽤⾮常频繁。正则表达式的使⽤可以参考⽹络上其他博客。
艾美奖美剧关于正则表达式的使⽤这⾥介绍re库两个函数:
太原英语学校
arch(pattern, string ,flags=0)
官⽅解释为:Scan through string looking for a match to the pattern, returning a match object, or None if no match was found.
意思就是该⽅法是扫描⼀个字符串判断字符串是否满⾜设定的正则表达式匹配模式,如果匹配成功,则返回⼀个匹配对象,否则返回nome
testwordlist = "aksdjeiruiurixckjxvsdouauosdfouii"
四级查询入口w = re.arch(r'[aeiou]{2,}',testwordlist) #匹配字符串中含有连续两个或两个以上的元⾳
print(w)
可以看出返回值的类型不是⼀个list或是匹配的单词
所以要从⽂本中过滤出想要的⽂本的时候:使⽤if判断
[w for w pus.words.words() if re.arch(r'[aeiou]{2,}',w)]
re.findall(pattern, string ,flags = 0)
官⽅解释:Return a list of all non-overlapping matches in the string.
If one or more capturing groups are prent in the patern, return a list of groups; this will be a list of typles if the pattern has more than one group
意思:函数将返回⼀个列表,这个列表中包含从字符串中匹配了的⾮重叠的匹配项(这个non-overlapping我也没明⽩什么意思,但可以确定不是重复的意思)。
如果匹配模式中有多个匹配组,那么返回的列表将是⼀个包含元组的列表。即列表的单项是元组
testwordlist = "aifffaihhioilleiio"
re.findall(r'[aeiou]{2,}',testwordlist)
可以看出返回的是所有匹配的内容,且有重复对象
对⽐:
返回对象不同:arch⽅法返回的是⼀个包含匹配信息的对象;findall⽅法返回的是⼀个list,其包含所有匹配成功的内容,注意不是匹配的源对象。