【问题标题】:Extracting Proper Lake Names from Text in R从 R 中的文本中提取正确的湖名称
【发布时间】:2019-12-03 02:22:02
【问题描述】:

我正在尝试从我在 R 中的一些文本中提取 Lakes 的名称。 Lakes 是正确的(大写),但需要我在“Lake”一词的两侧提取几个单词。

我尝试了一些方法,但都没有达到我想要的效果……在某些情况下,句子或文章可能以“Lake”开头,因此之前没有文字。在某些情况下,正确的名称可能是 3 个单词(Lake St. Clair 或 Red Hawk Lake)。

使用的示例代码:

text <- paste("Lake Erie is located on the border of the United States and Canada.",
          "It is located nearby to Lake St. Clair and Lake Michigan.",
          "All three lakes have a history of high levels of Phosphorus.",
          "One lake that has not yet been impacted is Lake Ontario.")

这可能是我得到的最接近的——从另一个堆栈溢出中提取,但它仍然没有解决。

context <- function(text){splittedText <-strsplit(text,'',T) print(splitted Text) data.frame(before = head(c('',splittedText),-1),words=splittedText,after=tail(c(splittedText,''),-1))}

info <- context(text)
print(subset(info, words == 'Lake')

我想获得:1)提取的正确湖泊名称(“伊利湖”、“圣克莱尔湖”等)或 2)在“湖”之前和之后包含单词的数据框。理想情况下是第一个,但我现在很灵活。

before <- c("","nearby to", "Clair and","impacted is")
Lake <- c("Lake","Lake","Lake","Lake")
after <- c("Erie is","St. Clair", "Michigan ","Ontario ")
output <- data.frame(cbind(before,Lake,after)); print(output)

提前感谢您的帮助!

【问题讨论】:

    标签: r text nlp capitalization phrase


    【解决方案1】:

    您需要定义一些规则来根据您拥有的数据提取单词。在这里,我得到了单词"Lake"之后的第一个单词。

    stringr::str_extract_all(text, "Lake \\w+")[[1]]
    #[1] "Lake Erie"     "Lake St"       "Lake Michigan" "Lake Ontario" 
    

    或者类似地在基础R中

    regmatches(text, gregexpr("Lake \\w+", text))[[1]]
    

    对于给定的text,这几乎可以工作,除了"Lake St. Clair" 缺少"Clair" 部分。为了解决这个问题,我们可以定义另一个规则,如果在"Lake" 的下一个单词之后有一个点,我们会提取两个单词,但是对于"Lake Michigan""Lake Ontario",这将失败,因为它们在单词后面有句号.

    【讨论】:

    • 这很棒。是的,我看到了三个潜在的问题——1)“。”正如你提到的,2)有些湖泊是三个没有“。”的词。 (红鹰湖); 3)一些湖泊被命名为相反方向(红鹰湖)。我想我可以尝试编写一个规则,将所有大写单词都放在“Lake”周围——那么唯一的问题就是“.”......
    【解决方案2】:

    有了stringi,我们可以使用

    library(stringi)
    stri_extract_all_regex(text, "Lake\\s+\\w+")[[1]]
    #[1] "Lake Erie"     "Lake St"       "Lake Michigan" "Lake Ontario" 
    

    或使用str_match_all

    library(stringr)
    str_match_all(text, "Lake\\s+\\w+")[[1]][,1]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-30
      • 2022-06-25
      • 1970-01-01
      • 2015-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多