【问题标题】:extracting a word (of variable length) ending with 동 from a string in R从R中的字符串中提取以동结尾的单词(可变长度)
【发布时间】:2017-04-02 08:02:05
【问题描述】:

我在 R 中有一个数据框,其中一列包含韩语地址。我需要提取其中一个词(一个以동结尾的词),如果它在那里(它可能丢失)并创建一个名为“dong”的新列,它将包含这个词。所以我的数据显示在“地址”列中,所需的输出显示在下面的“dong”列中。

address <- c("대전광역시 서구 탄방동 홈플러스","대전광역시 동구 효동 주민센터","대전광역시 대덕구 오정동 한남마트","대전광역시 동구 자양동 87-3번지 성동경로당","대전광역시 유성구 용계로 128")
dong <- c("탄방동","효동","오정동","자양동",NA)
data <- data.frame(address,dong, stringsAsFactors = FALSE)

我尝试过使用 grep,但它并没有完全满足我的需求。

grep(".+동\\s",data$address,value=T)

我认为我有 2 个问题:1) 我不确定如何编写正确的正则表达式来识别我需要的单词,以及 2) 我不确定为什么 grep 返回整个字符串而不是单词。我将不胜感激任何建议。

【问题讨论】:

  • 您不需要额外的库,请参阅this demo。此外,将整个单词与单词边界匹配,而不是与空格匹配。

标签: r regex korean-nlp


【解决方案1】:

提取以特定字母结尾的韩语整个单词的正则表达式是

\b\w*동\b

请参阅regex demo

详情

  • \b- 引导词边界
  • \w* - 0+ 个单词字符
  • - 结尾字母
  • \b - 词尾边界

R demo

address <- c("대전광역시 서구 탄방동 홈플러스","대전광역시 동구 효동 주민센터","대전광역시 대덕구 오정동 한남마트","대전광역시 동구 자양동 87-3번지 성동경로당","대전광역시 유성구 용계로 128")
## matches <- regmatches(address, gregexpr("\\b\\w*동\\b", address, perl=TRUE ))
matches <- regmatches(address, gregexpr("\\b\\w*동\\b", address ))
dong <- unlist(lapply(matches, function(x) if (length(x) == 0) NA else x))
data <- data.frame(address,dong, stringsAsFactors = FALSE)

输出:

                                     address   dong
1            대전광역시 서구 탄방동 홈플러스 탄방동
2              대전광역시 동구 효동 주민센터   효동
3          대전광역시 대덕구 오정동 한남마트 오정동
4 대전광역시 동구 자양동 87-3번지 성동경로당 자양동
5               대전광역시 유성구 용계로 128   <NA>

请注意,dong &lt;- unlist(lapply(matches, function(x) if (length(x) == 0) NA else x)) 行是必要的,以将 NA 添加到未找到匹配项的行。

【讨论】:

  • 非常感谢!这也很好用。非常感谢您的详细解释。
【解决方案2】:

grep 返回整个字符串。在您的情况下,stringr 库很有用。

library(stringr)
str_match(paste0(data$address, ' '), '([^\\s]+동)\\s')
     [,1]      [,2]    
[1,] "탄방동 " "탄방동"
[2,] "효동 "   "효동"  
[3,] "오정동 " "오정동"
[4,] "자양동 " "자양동"
[5,] NA        NA      

第 2 列是您想要的。请注意,我在字符串末尾添加了一个空格,以便如果字符串末尾出现“dong”,则正则表达式将匹配。

【讨论】:

  • 非常感谢,效果很好!感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2017-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-18
  • 1970-01-01
  • 1970-01-01
  • 2018-10-11
相关资源
最近更新 更多