我应该使用哪个函数将非结构化文本文件读入 R? [关闭]
Posted
技术标签:
【中文标题】我应该使用哪个函数将非结构化文本文件读入 R? [关闭]【英文标题】:Which function should I use to read unstructured text file into R? [closed] 【发布时间】:2013-11-11 22:34:00 【问题描述】:这是我在这里的第一个问题,我是 R 新手,试图弄清楚如何进行数据处理的第一步,请保持简单:)
我想知道在 R 中加载非结构化文本数据以进行进一步处理的最佳函数和有用的数据结构是什么。例如,假设我有一本书存储为文本文件, 里面没有换行符。
使用read.delim()
并将数据存储在列表中是个好主意吗?还是字符向量更好,我将如何定义它?
提前谢谢你。
PN
附:如果我使用“。”作为我的分隔符,它会处理像“先生”这样的东西。作为一个单独的句子。虽然这只是一个例子,我并不担心这个缺陷,只是出于教育目的,我仍然很好奇你会如何解决这个问题。
【问题讨论】:
欢迎来到 SO!请阅读asking questions 和writing good R questions。不看实际文件,这有点太宽泛了。 我建议先取一个小样本(可能是首页、段落或几句),然后尝试一些可用的方法。然后,您将了解哪些有效,哪些无效,并且可以提出任何具体问题。 查看tm包,这里有小插图cran.r-project.org/web/packages/tm/vignettes/tm.pdf第一部分有数据导入的信息 欢迎加入! @Thomas 从我嘴里说出来的话! 谢谢大家的欢迎。我认为这个例子非常清楚和具体:该函数必须采用任何随机有限的英文文本字符串,而不需要换行。采用 ”。”作为您的分隔符并将文本加载到数据结构中,该数据结构允许您计算每个句子中主语与宾语的比率。你会使用哪个函数和哪个数据结构? 【参考方案1】:read.delim
以表格格式读取数据(行和列,如在 Excel 中)。它对于读取一串文本不是很有用。
要将文本文件中的文本读入 R,您可以使用 readLines()
。 readLines()
创建一个包含与文本行一样多的元素的字符向量。对于此类软件,行是任何以换行符结尾的文本字符串。 (阅读 Wikipedia 上的 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—\"
请注意,您可以在 *** 中将长文本滚动到左侧。第七行比这一列的宽度长。
如您所见,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 将无法知道它不应该在“先生”之后拆分。您必须在正则表达式中定义异常。对此进行解释超出了本问题的范围。
你将如何告诉 R 如何识别主题或对象,我不知道。
【讨论】:
这正是我所希望的讨论。谢谢!关于空间的好点,不要担心“先生”。和主体/客体。这只是一个具体的例子。我想到的是带有一些分隔符的非结构化长字符串。所以我看到你从控制台加载 x 而你不喜欢 read.delim。那么如何从文本文件中加载字符串呢?我试过 load("text.txt") 但我得到一个错误:错误:错误的恢复文件幻数(文件可能已损坏)-没有数据加载帮助说我只能在我之前保存的情况下使用 load()。什么你会用从文件中加载上面的 x 吗? 我编辑了我的答案来解决您的问题。 我还编辑了您的问题,希望它能够重新打开。希望这没问题。 感谢您的时间和解释。非常有帮助且内容丰富。我试过了,它有效。非常感谢! 不能加个赞,还没资格,但我很喜欢:)以上是关于我应该使用哪个函数将非结构化文本文件读入 R? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
在python中,我应该如何使用函数将文件读入二维列表后,不要让二维列表为空