在 R 中使用 scan() 提取句子
Extracting sentences using scan() in R
我被告知我不应该使用 R 来扫描文本(但我一直在这样做,无论如何,等待获得其他技能)并且遇到了一个让我困惑到足以退回到这些的问题为一个。提前感谢您的帮助。
我正在尝试将大量文本(例如短篇小说)存储为字符串向量,每个字符串都是一个单独的句子。我一直在使用 scan() 函数执行此操作,但我遇到了两个基本问题:(1) scan() 似乎只允许使用一个分隔符,而句子显然可以以多种方式结束。我知道如何使用正则表达式标记句子的结尾(例如 [!?\.],但我不知道 R 中有使用正则表达式拆分文本的函数。(2) scan() 似乎自动考虑一个新行作为一个新字段,而我希望它忽略新行,除非它们与句子的结尾重合。
download.file("http://www.textfiles.com/stories/3lpigs.txt","threelittlepigs.txt")
threelittlepigs_s<-scan("threelittlepigs.txt",character(0),
sep=".",quote=NULL)
如果我不包括 'quote=NULL' 选项,scan() 会抛出警告,指出 EOF(我猜是字段结束)位于引号字符串内。这会产生一些多行 elements/fields,但非常不稳定。我似乎无法辨别模式。
抱歉,如果之前有人问过这个问题。我相信有一个简单的解决方案。我更喜欢一个可以帮助我理解为什么 scan() 没有按我期望的方式工作的工具,但是如果有更好的工具来读取 R 中的文本,请告诉我。
R 有一些非常强大的文本挖掘能力,有很多强大的包。例如,tm
、rvest
、stringi
等。
但这是一个几乎完全在 base R 中执行此操作的简单示例。我只使用 magrittr
中的 %>%
管道,因为我认为这使代码更具可读性。
你的问题的具体答案是你可以使用正则表达式来搜索多个标点符号。在下面的示例中,我使用 "[\.?!] "
,意思是句号、问号或感叹号,后跟 space。您可能需要进行试验。
试试这个:
library("magrittr")
url <- "http://www.textfiles.com/stories/3lpigs.txt"
corpus <- url %>%
paste(readLines(url), collapse=" ") %>%
gsub("http://www.textfiles.com/stories/3lpigs.txt", "", .)
head(corpus)
z <- corpus %>%
gsub(" +", " ", .) %>%
strsplit(split = "[\.?!] ")
z[[1]]
结果:
z[[1]]
[1] " THE THREE LITTLE PIGS Once upon a time "
[2] ""
[3] ""
[4] "there were three little pigs, who left their mummy and daddy to see the world"
[5] "All summer long, they roamed through the woods and over the plains,playing games and having fun"
[6] "None were happier than the three little pigs, and they easily made friends with everyone"
[7] "Wherever they went, they were given a warm welcome, but as summer drew to a close, they realized that folk were drifting back to their usual jobs, and preparing for winter"
[8] "Autumn came and it began to rain"
[9] "The three little pigs started to feel they needed a real home"
[10] "Sadly they knew that the fun was over now and they must set to work like the others, or they'd be left in the cold and rain, with no roof over their heads"
...etc
我被告知我不应该使用 R 来扫描文本(但我一直在这样做,无论如何,等待获得其他技能)并且遇到了一个让我困惑到足以退回到这些的问题为一个。提前感谢您的帮助。
我正在尝试将大量文本(例如短篇小说)存储为字符串向量,每个字符串都是一个单独的句子。我一直在使用 scan() 函数执行此操作,但我遇到了两个基本问题:(1) scan() 似乎只允许使用一个分隔符,而句子显然可以以多种方式结束。我知道如何使用正则表达式标记句子的结尾(例如 [!?\.],但我不知道 R 中有使用正则表达式拆分文本的函数。(2) scan() 似乎自动考虑一个新行作为一个新字段,而我希望它忽略新行,除非它们与句子的结尾重合。
download.file("http://www.textfiles.com/stories/3lpigs.txt","threelittlepigs.txt")
threelittlepigs_s<-scan("threelittlepigs.txt",character(0),
sep=".",quote=NULL)
如果我不包括 'quote=NULL' 选项,scan() 会抛出警告,指出 EOF(我猜是字段结束)位于引号字符串内。这会产生一些多行 elements/fields,但非常不稳定。我似乎无法辨别模式。
抱歉,如果之前有人问过这个问题。我相信有一个简单的解决方案。我更喜欢一个可以帮助我理解为什么 scan() 没有按我期望的方式工作的工具,但是如果有更好的工具来读取 R 中的文本,请告诉我。
R 有一些非常强大的文本挖掘能力,有很多强大的包。例如,tm
、rvest
、stringi
等。
但这是一个几乎完全在 base R 中执行此操作的简单示例。我只使用 magrittr
中的 %>%
管道,因为我认为这使代码更具可读性。
你的问题的具体答案是你可以使用正则表达式来搜索多个标点符号。在下面的示例中,我使用 "[\.?!] "
,意思是句号、问号或感叹号,后跟 space。您可能需要进行试验。
试试这个:
library("magrittr")
url <- "http://www.textfiles.com/stories/3lpigs.txt"
corpus <- url %>%
paste(readLines(url), collapse=" ") %>%
gsub("http://www.textfiles.com/stories/3lpigs.txt", "", .)
head(corpus)
z <- corpus %>%
gsub(" +", " ", .) %>%
strsplit(split = "[\.?!] ")
z[[1]]
结果:
z[[1]]
[1] " THE THREE LITTLE PIGS Once upon a time "
[2] ""
[3] ""
[4] "there were three little pigs, who left their mummy and daddy to see the world"
[5] "All summer long, they roamed through the woods and over the plains,playing games and having fun"
[6] "None were happier than the three little pigs, and they easily made friends with everyone"
[7] "Wherever they went, they were given a warm welcome, but as summer drew to a close, they realized that folk were drifting back to their usual jobs, and preparing for winter"
[8] "Autumn came and it began to rain"
[9] "The three little pigs started to feel they needed a real home"
[10] "Sadly they knew that the fun was over now and they must set to work like the others, or they'd be left in the cold and rain, with no roof over their heads"
...etc