将文本转换为小写但保留字中第一个字母的大写(如果可能,在tm包中使用R)

时间:2014-05-17 14:19:42

标签: string r lowercase tm

是否有用于将文本更改为小写的R函数,但是对于每个单词的第一个字母,即更改?

"You live NEAR Chicago"

"You live Near Chicago"

如果可能的话,重点是从一个非常有效的实施中受益。

这可以集成到tm R包中(或者已经在那里可用),以便它可以直接应用于语料库吗?

(目标是在文本中构建一个简单的位置检测器,与地理名称交叉)。

1 个答案:

答案 0 :(得分:1)

如果您正在处理地理位置旁边的单词(如“near”),那么现有的代码片段就像ucfirst位的功能一样。但是,你提到了速度,所以这里是Rcpp实现与基本/直接R实现(两者都是矢量化)之间的比较:

library(Rcpp)
library(microbenchmark)

# pure Rcpp/C++ implementation

sourceCpp("
#include <Rcpp.h> 

using namespace Rcpp; 

// [[Rcpp::export]]
std::vector< std::string > ucfirst( std::vector< std::string > strings ) {

  int len = strings.size();

  for( int i=0; i < len; i++ ) {
    std::transform(strings[i].begin(), strings[i].end(), strings[i].begin(), ::tolower);
    strings[i][0] = toupper( strings[i][0] );
  }

  return strings;

}")

r_ucfirst <- function (str) {
  paste(toupper(substring(str, 1, 1)), tolower(substring(str, 2)), sep = "")
}

print(ucfirst("hello"))
## [1] "Hello"

print(r_ucfirst("hello"))
## [1] "Hello"

mb <- microbenchmark(ucfirst("hello"), r_ucfirst("hello"), times=1000)
print(mb)

## Unit: microseconds
##                expr   min    lq median     uq    max neval
##    ucfirst("hello") 1.925 2.123 2.2765 2.4025 20.844  1000
##  r_ucfirst("hello") 6.199 7.059 7.5285 7.9555 41.473  1000

两者都应兼容跨平台。使用一些C-hack可以在C ++中获得更快的速度,但对于1,000次转换,2.27μs并不是完全错误(纯R版本也不是7.5μs) -

话虽如此,您可以尝试使用stringi包来实现“纯R”版本,该版本使用Rcpp / C ++ / C支持的函数。