本节书摘来异步社区《NLTK基础教程——用NLTK和Python库构建机器学习应用》一书中的第2章,第2.1节,作者:Nitin Hardeniya,更多章节内容可以访问云栖社区“异步社区”公众号查看。
2.1 何谓文本歧义
事实上,要想给文本/数据歧义这个术语一个定义是相当困难的。本书将它定义成从原生数据中获取一段机器可读的已格式化文本之前所要做的所有预处理工作,以及所有繁复的任务。该过程应该涉及数据再加工(data munging)、文本清理、特定预处理、标识化处理、词干提取或词形还原以及停用词移除等操作。下面我们就先来看一个基本实例,解析一个csv文件:
>>>import csv
>>>with open('example.csv','rb') as f:
>>> reader = csv.reader(f,delimiter=',',quotechar='"')
>>> for line in reader :
>>> print line[1] # assuming the second field is the raw sting
如你所见,上述代码在试图对csv文件进行解析,它将会csv文件中所有的列元素构造成一个列表。我们在这操作过程中可以自定义相关的分隔符和引用符(quoting character)。现在的问题是,这些原生字符串会涉及上一章中所学到的那些不同类型的文本歧义。而其中的关键是我们要提供能应付日常csv文件的足够细节的信息。
这些最常见文档类型通常都有一个清晰的处理流程,我们可以通过图2-1了解一下。
在上图中,堆栈的第一层中列出了一些最常见的数据源。在大多数情况下,我们遇到的数据都属于这些数据格式中的某一个。接下来的这一层是Python对于这些数据格式最常见的封装方式。例如在之前的csv文件的例子中,Python的csv模块是处理csv文件最可靠的方法。通过该模块,我们可以使用各种不同的分离器和引用符等工具。
除此之外,json也是一种常见的文件格式。
下面来看一个具体的json实例:
{
"array": [1,2,3,4],
"boolean": True,
"object": {
"a": "b"
},
"string": "Hello World"
}
现在让我们来处理一下该字符串,其解析代码如下:
>>>import json
>>>jsonfile = open('example.json')
>>>data = json.load(jsonfile)
>>>print data['string']
"Hello World"
如你所见,这里只是用json模块加载了一个json文件。Python允许我们挑选相关原生字符串的形式并对其进行处理。关于其他所有数据源的更详细信息以及Python中相关的解析工具包,请读者自行参考我们上面列出的那个图表。当然,我们在这里只能指出相关的方向,至于这些工具包的详细信息,还需读者自己上网去搜索。
所以,在我们针对这些不同的文档格式编写自己的解析器之前,请再看一下上图第二行中所列出的Python解析器。当我们获得某一段原生字符串时,所有相关的预处理步骤都可以被当作是某一种管道,或者还可以选择性地忽略掉其中的部分内容。下一节,我们将会具体讨论标识化处理、词干提取以及词形还原的相关细节。并且,我们也会讨论一下这些应用的各种变化,以及何时适用于其他场景。
注意 提示:
现在,既然我们对文本歧义是什么有了一点想法,就请试着用上述图表中所列出的某个Python模块连接任意一种数据库试试。