关键字列表中包含汉字和英文单词,如下所示:
[1] " 服务 接口 知识 组织 开放 查询 语义 推理 Web 服务 "
[2] " Solr 分面 搜索 标准 信息管理 "
[3] " 语义 W i k i 标注 导航 检索 S e m a n t i c M e d i a W i k i P A U X I k e W i k i "
[4] " Liferay 主从 模式 集成 知识 平台 "
[5] " 数据 摄取 SKE 本体 属性 映射 三元组 存储 "有些英语单词在每个字符(如第三行)、“W i k i”、“S e m a n t i c M e d i a W i k i”、“P A U X”、“I k e W i k i”之间都有空格。在这些词中,有两个以上的空间。现在我试着删除这些英文单词中的空格到结果:“Wiki”,“SemanticMediaWiki”,“PAUX”,“IkeWiki”,还有其他像以前一样的单词。我以前用过“gsub”这个词:“kwdict<-gsub("^[[:alpha:][:blank:]]+", "\\w", kwdict)”。但是无论我使用"\w“还是”[:alpha:]“,结果都是错误的,所有的单词都被更改了。我们如何准确地选择这些英语单词并删除其中的空格?
[1] " 服务 接口 知识 组织 开放 查询 语义 推理 Web 服务 "
[2] " Solr 分面 搜索 标准 信息管理 " [3] " 语义 Wiki 标注 导航 检索 SemanticMediaWiki PAUX IkeWiki "
[4] " Liferay 主从 模式 集成 知识 平台 " [5] " 数据 摄取 SKE 本体 属性 映射 三元组 存储 "我试了很多次,用R和下面的句子分开
kwdict<-gsub("[[:alpha:]/[:space:]{1}]", "", kwdict)
kwdict<-gsub("[^[:alpha:]_[:space:]]{1}", "", kwdict)
kwdict<-gsub("[^[:alpha:][:space:]]{1}", "", kwdict)
kwdict<-gsub("[^[:alpha:][:space:]{1}^[:alpha:]]", "", kwdict)
kwdict<-gsub("[//>[:space:]{1}]", "", kwdict)
kwdict<-gsub("[[:alpha:][:space:]{1}]", "", kwdict)但是它什么也没做,删除了所有的空格,甚至清除了所有的单词!我认为这是因为模式包括“:alpha:”我们用来定位空格字符的起始标记。有任何想法来正确定义这个模式使用R吗?
发布于 2017-04-14 14:06:46
感谢@赵鸿丰和@waterling的一些评论
我想我能找到你问题的根源,问题是那些你认为是英语字母的单词--它们在nature.They中不是ascii --实际上是英文字母的拉丁文大小写。然而,有些字母是英文的(“太阳”和"Liferay")。
运行下面的命令将此转换为UTF-8 (您可能不需要这样做,我很乐意看到UTF-8格式的东西,而且做google也没有给我更好的UTF-8)。
string <- c(" 服务 接口 知识 组织 开放 查询 语义 推理 Web 服务 ",
" Solr 分面 搜索 标准 信息管理 " ,
" 语义 W i k i 标注 导航 检索 S e m a n t i c M e d i a W i k i P A U X I k e W i k i ",
" Liferay 主从 模式 集成 知识 平台 " ,
" 数据 摄取 SKE 本体 属性 映射 三元组 存储 ")
Encoding(string) <- "UTF-8"运行上面的命令之后,就会看到带有这些字符的UTF-8值。我在互联网上搜索了这些价值转化为什么。我偶然发现了这 site。这些帮助我理解与之相关的UTF-8值。
所以我编写了小regex来解决您的问题,我使用了stringr库。您可以选择任何库/库R gsub来解决您的问题。
value <- str_replace_all(string,'(?<=[\U{FF41}-\U{FF5A}]|[\U{FF21}-\U{FF3A}])\\s*',"")要理解正则表达式:
字符类(用方括号表示)包含大写字母和小写字母的UTF范围(我在上面提到的站点中找到了这些字母)。我将它们与\s一起放入regex查找断言中,它表示空格。我已经匹配了空间,然后什么也没有替换。这样的话,我得到的结果如下所示。我希望这是你所期望的。另外,由于您无法在控制台上看到这一点,所以在翻译成html时,可以使用str_view_all函数来查看这些字母。我只是复制和粘贴了结果。
服务 接口 知识 组织 开放 查询 语义 推理 Web 服务
Solr 分面 搜索 标准 信息管理
语义 Wiki标注 导航 检索 SemanticMediaWikiPAUXIkeWiki
Liferay 主从 模式 集成 知识 平台
数据 摄取 SKE 本体 属性 映射 三元组 存储我希望这能详细解释你的问题的解决办法。谢谢!
在OP的注释之后,他似乎想用普通字母替换宽的拉丁文格式,一个外部文件用于替换unicode,这个文件(NamesList.txt)可以在 this 链接找到。
library(stringr)
library(Unicode) ##Unicode is a beautiful library having lot of great functions such as u_char_from_name which is used here.
rd_dt <- readLines("NamesList.txt",encoding="UTF-8")
##cleaning of Nameslist.txt which has unicode values against wide latin alphabet
rd_dt1 <- rd_dt[grep("[[:alnum:]]{4}\t.*",rd_dt)]
rd_dt1 <- read.delim(textConnection(rd_dt1),sep="\t",stringsAsFactors = F)
rd_dt1 <- rd_dt1[,1:2]
names(rd_dt1) <- c("UTF_8_values","Symbol")
rd_dt1 <- rd_dt1[grep("LATIN",rd_dt1$Symbol),]
rd_dt1 <- rd_dt1[grep("WIDTH",rd_dt1$Symbol),]
value <- substr(rd_dt1$Symbol,nchar(trimws(rd_dt1$Symbol)),nchar(trimws(rd_dt1$Symbol)))
rd_dt1$value <- value
###Assigning captial and small english letter to their corresponding latin wide small and captial letters
letters <- grepl("CAPITAL",rd_dt1$Symbol)+0
captial_small <- ifelse(letters==1,toupper(rd_dt1$value),tolower(rd_dt1$value))
rd_dt1$capital_small <- captial_small
rd_dt1 <- rd_dt1[,c(1,2,4)]
### From OP's source taking the text which is non english and it is wide latin text
dt <- c('SemanticMediaWikiPAUXIkeWiki')
###Check of the contents between UTF values of OP's text content and the UTF-8 text files
as.u_char(utf8ToInt(dt)) %in% u_char_from_name(rd_dt1$Symbol)转换的最后答案:
paste0(rd_dt1[match(utf8ToInt(dt),u_char_from_name(rd_dt1$Symbol)),"capital_small"],collapse="")
结果:
> paste0(rd_dt1[match(utf8ToInt(dt),u_char_from_name(rd_dt1$Symbol)),"capital_small"],collapse="")
[1] "SemanticMediaWikiPAUXIkeWiki"警告:上面的代码与MacOSX塞拉利昂和R-3.3很好地工作,然而在windows上,在R工作室控制台自动转换成相应的英文文本,我无法看到针对这些文本的UTF-8代码。我无法确定原因。
编辑
我最近发现,在stri_trans_general库中有一个名为stringi的函数,它可以高效地完成这项任务,一旦使用regex删除了空格,我们就可以使用下面的代码直接翻译拉丁语宽字母表:
dt <- c('SemanticMediaWikiPAUXIkeWiki')
stringi::stri_trans_general(dt, "latin-ascii")答案与上文所述相同。
https://stackoverflow.com/questions/42685988
复制相似问题