nltk(4)——加工原始语料库

加工原始语料库

分词

做自然语言处理,一定离不开数据资源,即对数据资源的分析,了解其中潜在的内容。
网络上存在众多的资源,如文本,网页等等。这次写的主要是文本和网页。
1、我们要使用程序获取本地或网络上的资源,从而使众多的资源成为自己的资源
2、如何对资源进行简单的处理,例如标点符号等等,使文本符合我们的要求。
3、编写程序格式化我们想要的输出。

电子书

查看书中的代码是from urllib import urlopen,但是在更新的nltk中已经没有这个导入了,取而代之的是from urllib import request
所以从网络中下载电子图书并进行处理:

from urllib import request
url = "http://www.gutenberg.org/files/2554/2554.txt"
raw = request.urlopen(url)   #从网络中下载电子书,转换成纯文本的字符串
type(raw)
len(raw)

对文本进行分词
书中的原始代码tokens = nltk.word_tokenize(raw)
但是更新后的nltk,相关的api变了,新的分词为:

from nltk import tokenize
tokens = tokenize.word_tokenize(raw)
type(tokens)    #返回得到是一个list链表

此处得到的是一个链表,文章中说对链表进行进一步的处理,将链表转换成nltk.Text类型,由此可以进行nltk提供的各种方法的处理。(至于为什么暂时未搞懂)

text = nltk.Text(tokens)
type(text)
tokens
text

nltk(4)——加工原始语料库_第1张图片
可以看出来,两种类型还是有一定的区别的,转换成Text后就不是list了
当然如果已经将文件下载到了本地,python也提供了oi操作,读取本地文件。

from nltk import tokenize
file = open('/home/ubuntu/Documents/111.txt')
raw = file.read()
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("http://geek.csdn.net/news/detail/58565")
html = stream.read()    #读取文件成文本
raw = nltk.clean_html(html) #过滤html标签
tokens = tokenize.word_tokenize(raw)
text = nltk.Text(tokens)

字符串处理常用方法

因为在进行上面的处理是,我们需要对原始字符串进行一定的处理,所以掌握常见字符串的处理方法也是必要的。

方法 功能
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.titlecase() 将字符串s首字母大写
s.strip() 返回一个没有首尾空白字符的S的拷贝
s.replace(t, u) 用u替换s中的t

正则表达式使用

在自然语言处理的初始阶段,对原始语料进行处理时,正则表达式的使用非常频繁。正则表达式的使用可以参考网络上其他博客。
关于正则表达式的使用这里介绍re库两个函数:
search(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.search(r'[aeiou]{2,}',testwordlist)  #匹配字符串中含有连续两个或两个以上的元音
print(w)

这里写图片描述
可以看出返回值的类型不是一个list或是匹配的单词
所以要从文本中过滤出想要的文本的时候:使用if判断

[w for w in nltk.corpus.words.words() if re.search(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 present 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)

这里写图片描述
可以看出返回的是所有匹配的内容,且有重复对象
对比:
返回对象不同:search方法返回的是一个包含匹配信息的对象;findall方法返回的是一个list,其包含所有匹配成功的内容,注意不是匹配的源对象。

你可能感兴趣的:(自然语言处理)