首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >与stringi包中的stringr::word等效的函数

与stringi包中的stringr::word等效的函数
EN

Stack Overflow用户
提问于 2017-11-13 20:07:40
回答 3查看 185关注 0票数 1

我翻阅了stringi包手册,在stringr包中找到了与函数word()等效的函数,但我找不到它。我寻找它的原因是因为我想为我的语言环境设置排序规则选项,而stringr并没有给我提供stringi所能提供的所有选项。在stringi包中是否有一个函数与stringr包中的word()函数具有相同的功能?请看下面的例子,我想要在单词"José“后面接下来的三个单词,这是以不同的方式写的。在stringi包中,函数stri_opts_collator允许将参数strength=1设置为允许的排序强度,因此所有形式的"José“都会被考虑在内。

代码语言:javascript
复制
sentencas<-c("josé é um trabalhador responsável","José é um trabalhador 
responsável","jose é um trabalhador responsável","Jose é um trabalhador 
responsável")

sentencas %>% word(2,sep=coll("jose ",ignore_case=T)) %>% word(1,3)

使用stringi,我可以提取所有形式的"José":

代码语言:javascript
复制
stri_extract_first_coll(sentencas,"jose",strength=1).

我想做这样的事情:

代码语言:javascript
复制
sentencas %>% word(2,sep=coll("jose ",strength=1)) %>% word(1,3)
EN

回答 3

Stack Overflow用户

发布于 2017-11-13 21:43:01

stringr::word()不完全相同,但这似乎可以解决这个问题:

代码语言:javascript
复制
sentencas %>% 
  stri_split_coll("jose ", strength=1, simplify = TRUE) %>% 
  .[,2] %>% 
  word(1,3)
票数 2
EN

Stack Overflow用户

发布于 2017-11-13 22:09:23

这是另一个选择。请注意,我已经在您的标记词之前引入了一些单词用于提取,即"Josè",因为我假设您不仅会有以此单词开头的句子。重要的功能是组合使用stri_locate来检测标记词的结尾,添加一个字符位置,并将此位置与要传递给stri_sub的字符串中的最后一个字符位置一起使用。请注意,所提供的功能不是故障安全的,例如,对于零匹配的情况等。

还请检查以下基准,用于到目前为止提出的三个解决方案。

代码语言:javascript
复制
library(stringi)
library(magrittr)

sentencas<- c("some words josé é um trabalhador responsável"
              ,"only one word José é um trabalhador responsável"
             ,"several words jose é um trabalhador responsável"
             ,"and again some words Jose é um trabalhador responsável")

stri_word <- function(marker, str, words_after_marker) {

  stri_sub(str,  cbind(stri_locate_first_coll(str, marker ,strength=1)[, "end"]+1, nchar(str)) ) %>% 
  { gsub( "^\\s+|\\s+$", "", stri_extract_first_regex(., paste0("(\\s\\w+){", words_after_marker[1], ",", words_after_marker[2],"}"))) }

}

stri_word("jose", sentencas, c(1,3) )

#[1] "é um trabalhador" "é um trabalhador" "é um trabalhador" "é um trabalhador"

#Benchmarks
library(microbenchmark)
library(stringr)

stringi_positions <- function() {

  stri_word <- function(marker, str, words_after_marker) {

    stri_sub(str,  cbind(stri_locate_first_coll(str, marker ,strength=1)[, "end"]+1, nchar(str)) ) %>%
    { gsub( "^\\s+|\\s+$", "", stri_extract_first_regex(., paste0("(\\s\\w+){", words_after_marker[1], ",", words_after_marker[2],"}"))) }

  }

  stri_word("jose", sentencas, c(1,3) )


}

stringi_map <- function() {

  sentencas %>%
    map(stri_extract_all_words) %>% 
    map(~{
      .x <- flatten_chr(.x)
      map(.x, stri_detect_coll, "jose", ignore.case=TRUE, strength=1L) %>% 
        flatten_lgl() %>%
        which() -> pos
      .x[(pos+1):(pos+1+3)]
    })


}


semi_stringi <- function() {

  sentencas %>% 
    stri_split_coll("jose ", strength=1, simplify = TRUE) %>% 
    .[,2] %>% 
    word(1,3)


}


microbenchmark(
  stringi_map(),
  semi_stringi(),
  stringi_positions()
)

# Unit: microseconds
#                        expr      min       lq      mean    median        uq       max neval
# stringi_map()       3498.667 3752.886 4059.0339 4038.0925 4214.3480  7365.635   100
# semi_stringi()      485.543  558.966  805.0216  593.9015  652.7195 15806.567   100
# stringi_positions()  288.958  325.669  456.9946  344.6180  384.4865 10719.428   100
票数 2
EN

Stack Overflow用户

发布于 2017-11-13 21:46:16

word()是一个相当复杂的函数,在stringi中没有与之等价的单个函数。这是另一种实现预期效果的方法:

代码语言:javascript
复制
library(stringi)
library(purrr)

sentencas <- c("josé é um trabalhador responsável",
               "José é um trabalhador responsável",
               "jose é um trabalhador responsável",
               "Jose é um trabalhador responsável")

sentencas %>%
  map(stri_extract_all_words) %>% 
  map(~{
    .x <- flatten_chr(.x)
    map(.x, stri_detect_coll, "jose", ignore.case=TRUE, strength=1L) %>% 
      flatten_lgl() %>%
      which() -> pos
    .x[(pos+1):(pos+1+3)]
  })
## [[1]]
## [1] "é"           "um"          "trabalhador" 
## 
## [[2]]
## [1] "é"           "um"          "trabalhador"
## 
## [[3]]
## [1] "é"           "um"          "trabalhador" 
## 
## [[4]]
## [1] "é"           "um"          "trabalhador" 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47264030

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档