关键字列表包含中文字符和英文单词,如下所示:
[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 本体 属性 映射 三元组 存储 "
某些英文单词在每个字符(例如第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
之间有空格”。在这些词中,有两个以上的空间。
现在我正在尝试将这些英语单词中的空格删除为结果:“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?
正确定义这种模式答案 0 :(得分:1)
感谢 @赵鸿丰和 @waterling
的一些评论我想我能找到你问题的根源,问题是那些你认为是英文字母的单词,它们本质上不是ascii。它们实际上是拉丁文大写和小写的英文字母。但是,有些字母是英文字母(“Solar”和“Liferay”)。
运行以下命令将其转换为UTF-8(您可能不需要这样做,我很高兴看到UTF-8格式的东西,并且谷歌在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值。我在互联网上搜索了这些价值所转化的内容。我偶然发现了 this网站。这些帮助我理解了与之相关的UTF-8值。
所以我写了一个小的正则表达式来解决你的问题,我使用了stringr
库。您可以选择任何库/ BASE R gsub 来解决您的问题。
value <- str_replace_all(string,'(?<=[\U{FF41}-\U{FF5A}]|[\U{FF21}-\U{FF3A}])\\s*',"")
要理解正则表达式:
字符类(用方括号表示)包含UTF范围的大写和小写LATIN大写字母(我在上面提到的站点中找到)。我把它们放入正则表达式的外观断言以及表示空格的\ s。我已经匹配了空格,然后没有替换它们。这样,我的结果如下所示。我希望这是你所期待的。此外,由于您无法在控制台上看到此内容,因此您可以使用str_view_all
函数在翻译成html时查看这些字母。我只复制并粘贴了结果。
服务 接口 知识 组织 开放 查询 语义 推理 Web 服务
Solr 分面 搜索 标准 信息管理
语义 Wiki标注 导航 检索 SemanticMediaWikiPAUXIkeWiki
Liferay 主从 模式 集成 知识 平台
数据 摄取 SKE 本体 属性 映射 三元组 存储
我希望这能够详细解释您的问题。谢谢!!!
在OP的评论之后,似乎他想将宽拉丁语英语表格替换为普通字母,外部文件用于替换unicode,此文件(NamesList.txt)可以在< strong>此link
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"
CAVEAT :以上代码与MACOSX Sierra和R-3.3配合使用,但在Windows上,自动在R studio控制台上所有内容都转换为相应的英文文本,我无法看到UTF -8代码反对这些文本。我无法确定原因。
修改强>:
我最近发现stri_trans_general
库中有一个名为stringi
的函数可以非常有效地完成此任务,一旦使用正则表达式删除空格,如上所述,我们可以直接翻译拉丁语使用以下代码的宽字母:
dt <- c('SemanticMediaWikiPAUXIkeWiki')
stringi::stri_trans_general(dt, "latin-ascii")
答案与上面提到的相同。
答案 1 :(得分:0)
你可以用两个正则表达式来解决这个问题,首先用以下方法消除单词之间的单个空格
s/(\a)\s{1}/\1/g
然后用单个空格替换单词之间的2个或更多空格:
s/\s{2,}/ /g
将这两个正则表达式应用于以下文本:
T h i s i s a t e s t c a s e f o r m y r e g e x W o r d s c a n b e a r b i t r a r i l y s p a c e d
给出:
This is a test case for my regex Words can be arbitrarily spaced