是否有用于将文本更改为小写的R函数,但是对于每个单词的第一个字母,即更改?
"You live NEAR Chicago"
到
"You live Near Chicago"
如果可能的话,重点是从一个非常有效的实施中受益。
这可以集成到tm R包中(或者已经在那里可用),以便它可以直接应用于语料库吗?
(目标是在文本中构建一个简单的位置检测器,与地理名称交叉)。
答案 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支持的函数。