我应该使用哪个函数将非结构化文本文件读入R?

时间:2013-10-31 19:05:12

标签: r text-processing file-read readlines

这是我在这里的第一个问题,我是R的新手,试图找出如何进行数据处理的第一步,请保持简单:)

我想知道在R中加载非结构化文本数据以进行进一步处理的最佳功能和有用的数据结构。例如,假设我有一本书存储为文本文件,没有新的行字符。

使用read.delim()并将数据存储在列表中是一个好主意吗?或者是一个更好的字符向量,我将如何定义它?

提前谢谢。

PN

P.S。如果我使用“。”作为我的界限,它会对待像“先生”这样的事情作为一个单独的句子。虽然这只是一个例子,我并不关心这个缺陷,仅仅是出于教育目的,我仍然很好奇你是如何解决这个问题的。

1 个答案:

答案 0 :(得分:10)

read.delim以表格格式读取数据(包含行和列,如Excel中所示)。它对于读取一串文本并不是很有用。

要将文本文件中的文本读入R,您可以使用readLines()readLines()创建一个字符向量,其元素与文本行一样多。对于这种软件,一行是任何以换行符结尾的文本字符串。 (阅读维基百科上的newline。)当您编写文本时,按Return输入系统特定的换行符。实际上,文本行不是由软件窗口的宽度定义的,而是可以在许多可视行上运行。实际上,一行文本是书中的一个段落。因此,readLines()会将您的文字拆分为以下段落:

> readLines("/path/to/tom_sawyer.txt")
[1] "\"TOM!\""                                                                                                                                                                                                                                                                                                                                                                                                                                                                       
[2] "No answer."                                                                                                                                                                                                                                                                                                                                                                                                                                                                     
[3] "\"TOM!\""                                                                                                                                                                                                                                                                                                                                                                                                                                                                       
[4] "No answer."                                                                                                                                                                                                                                                                                                                                                                                                                                                                     
[5] "\"What's gone with that boy,  I wonder? You TOM!\""                                                                                                                                                                                                                                                                                                                                                                                                                             
[6] "No answer."                                                                                                                                                                                                                                                                                                                                                                                                                                                                     
[7] "The old lady pulled her spectacles down and looked over them about the room; then she put them up and looked out under them. She seldom or never looked through them for so small a thing as a boy; they were her state pair, the pride of her heart, and were built for \"style,\" not service—she could have seen through a pair of stove-lids just as well. She looked perplexed for a moment, and then said, not fiercely, but still loud enough for the furniture to hear:"
[8] "\"Well, I lay if I get hold of you I'll—\"

请注意,您可以在Stackoverflow中向左滚动长文本。第七行比这一列长。

如您所见,readLines()将长第七段读作一行。而且,正如您所看到的,readLines()在每个引号前添加了反斜杠。由于R将各行保持在引号中,因此需要将它们与原始文本中的那些区分开来。因此,它“逃脱”原始引号。阅读维基百科上的escaping

readLines()可能会输出警告,指出您的文件中存在“不完整的最后一行”。这只意味着在最后一行之后没有换行符。您可以使用readLines(..., warn = FALSE)来抑制此警告,但是您不必这样做,这不是错误,并且压制警告只会阻止警告消息。

如果您不想仅将文本输出到R控制台但进一步处理,请创建一个包含readLines()输出的对象:

mytext <- readLines("textfile.txt")

readLines()外,您还可以使用scan()readBin()和其他功能从文件中读取文字。通过输入?scan等来查看手册。查看?connections以了解将文件读入R的许多不同方法。

我强烈建议您在文本编辑器(如Vim,Notepad,TextWrangler等)中将文本写入.txt文件中,而不是像MS Word这样的文字处理器中编写文本。 Word文件包含的内容多于您在屏幕上显示或打印的文本,并且这些文本将由R读取。您可以尝试查看获得的内容,但为了获得良好的效果,您应该将文件保存为Word中的.txt文件或在文本编辑器中撰写。

您还可以将文本从任何其他软件中打开的文本文件复制粘贴到R或在R控制台中撰写文本:

myothertext <- c("What did you do?
+ I wrote some text.
+ Ah, interesting.")
> myothertext
[1] "What did you do?\nI wrote some text.\nAh, interesting."

注意在我用Return关闭字符串之前,输入")不会导致R执行命令。 R只回复+,告诉我可以继续编辑。我没有输入那些加号。试试吧。另请注意,现在换行符是文本字符串的一部分。 (我在Mac上,所以我的换行符为\n。)

如果您手动输入文本,我会将整个文本作为一个字符串加载到矢量中:

x <- c("The text of your book.")

您可以将不同的章节加载到此向量的不同元素中:

y <- c("Chapter 1", "Chapter 2")

为了更好地参考,您可以命名元素:

z <- c(ch1 = "This is the text of the first chapter. It is not long! Why was the author so lazy?", ch2 = "This is the text of the second chapter. It is even shorter.")

现在您可以拆分任何这些向量的元素:

sentences <- strsplit(z, "[.!?] *")

输入?strsplit以阅读此功能的手册并了解其所需的属性。第二个属性采用正则表达式。在这种情况下,我告诉strsplit将矢量的元素分成三个标点符号中的任意一个,然后是一个可选空格(如果你没有在这里定义一个空格,那么结果“句子”将在前面加上一个空间)。

sentences现在包含:

> sentences
$ch1
[1] "This is the text of the first chapter" "It is not long"                       
[3] "Why was the author so lazy"           

$ch2
[1] "This is the text of the second chapter" "It is even shorter"

您可以通过编制索引来访问单个句子:

> sentences$ch1[2]
[3] "It is not long"

R将无法知道它不应该在“Mr.”之后拆分。您必须在正则表达式中定义例外。解释这个问题超出了这个问题的范围。

如何告诉R如何识别主题或物体,我不知道。