7.1.2 多种格式文本文件的导入

7.1.2 多种格式文本文件的导入

在使用readtext包自带的数据集之前,需要先设置数据集所在的文件夹路径。通过system.file函数,我们可以获取数据所在的文件路径,对应代码如下,得到的readtext包示例数据如图7-1所示。

图7-1 readtext包示例数据

由图7-1可以看到,extdata目录中有几个包含不同文本文件的子文件夹,在下面的示例中,我们需要加载其中的一个或者多个文件。

1.读取txt格式的文件

在txt文件夹下有一个名为UDHR的文件夹,其中包含了13种语言的《世界人权宣言》,接下来我们尝试使用readtext()函数读取这13个文本文件,具体代码如下:

通过以上的运行结果可以发现,readtext()函数的返回值是一个数据框,其中文档的元数据保存在doc_id中,文档的内容保存在text中。文件的名称往往包含文档的元数据,我们可以通过“docvarsfrom="filename"”在文件名中获取这些数据,示例如下:

其中,docvarsnames参数设置了元数据的列名称,dvsep参数设置了分隔符。通过上述结果可以发现,每个文件名称分别按分隔符“_”分隔成了5个部分,即“unit”“context”“year”“language”“party”。

readtext()函数可以忽略子文件夹,即可以读取母文件夹下子文件夹里面的所有文本文件。以txt/movie_reviews文件夹为例,这个文件夹下有两个子文件夹,分别为neg和pos,我们可以通过读取movie_reviews文件夹,直接提取neg和pos文件夹中所有的文本文件,示例如下:

2.读取csv/tsv格式的文件

csv文件以逗号作为分隔符,在使用readtext()函数读取csv文件时,我们将文件中包含目标文本的列设为text_field参数的值,原始csv文件中的其他列则被视为文档级变量,示例如下:

tsv文件以制表符作为分隔符,tsv文件的读取与csv文件读取的过程一致,如下所示:

3.读取json格式的文件

json是一种轻量级的数据交换格式,以键值对的形式存在,键值和键名之间通过冒号分隔,两个键值对之间使用逗号分隔,举例如下:

在使用readtext()函数读取json文件时,也需要确定text_field参数的值,一旦目标文本的某个属性设置为text_field参数的值,那么该文本的其他属性值则被视为文档级变量读入,示例如下:

readtext()函数将每个对象视为一个不同的文本,并通过doc_id进行标识。通过输出的结果可以发现,inaugural_sample.json文件共有3个对象,即3条文本数据。

4.读取pdf格式的文件

readtext()函数也可以读取和转换pdf文件,我们可以通过pdf/UDHR文件夹下的pdf文件进行示例,代码和结果如下所示:

5.读取doc/docx格式的文件

doc和docx是微软Word文件的两种扩展名,在readtext包中,使用antiword包来处理扩展名为doc的文件,使用XML包来处理扩展名为docx的文件。接下来,我们尝试使用readtext()函数处理docx格式的文件,示例如下:

6.读取html格式的文件

readtext()函数可以直接读取网页中的文本,这里我们使用CRAN上的readtext包的首页来进行示例,代码如下:

7.读取压缩包内的文件

readtext()函数也可以直接读取压缩包内的文件,以extdata文件夹下的压缩包data_files_encodedtexts.zip为例,代码如下:

由上述代码输出结果可知,读取的文本出现了乱码,无法查看确切的中文信息。观察之后不难发现,在这个压缩包中,不同文件使用了不同的编码方式,这就涉及了读入不同编码格式文件的问题。我们可以通过文件名称提取每个文件的编码方式,然后进一步提取文件中的信息,代码和结果如下:

由上述输出结果不难发现,乱码问题已经解决。