gpt4 book ai didi

在 R 中使用正则表达式序列进行正则表达式数据清除

转载 作者:行者123 更新时间:2023-12-04 12:15:21 25 4
gpt4 key购买 nike

关键字列表包含汉字和英文单词,如下所示:

[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 正确定义这种模式吗?

最佳答案

感谢 的一些评论@赵鸿丰 @水灵

我想我能够找到你的问题的根源,问题是那些你认为是英文字母的单词它们本质上不是 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 范围(我在上面提到的站点中找到了)。我已将它们与表示空格的\s 一起放入正则表达式环视断言中。我已经匹配了空格,然后什么都没有替换它们。这样,我得到的结果如下所示。我希望这是你所期待的。此外,由于您在控制台上看不到这个,您可以使用 str_view_all翻译成 html 时查看这些字母的功能。我只复制并粘贴了结果。
服务 接口 知识 组织 开放 查询 语义 推理 Web 服务
Solr 分面 搜索 标准 信息管理
语义 Wiki标注 导航 检索 SemanticMediaWikiPAUXIkeWiki
Liferay 主从 模式 集成 知识 平台
数据 摄取 SKE 本体 属性 映射 三元组 存储

我希望这能详细解释您的问题的解决方案。谢谢 !!!

OP评论后 ,似乎他想将宽拉丁英文形式替换为普通字母,使用外部文件进行unicode替换,该文件(NamesList.txt)可以在 找到这个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"

警告 :上面的代码在 MACOSX Sierra 和 R-3.3 上运行良好,但是在 Windows 上,在 R Studio 控制台上,所有内容都会自动转换为相应的英文文本,我无法看到针对这些文本的 UTF-8 代码。我无法确定原因。

编辑 :

最近发现有个函数叫 stri_trans_generalstringi可以以非常有效的方式完成此任务的库,一旦使用上面提到的正则表达式删除空格,我们可以使用以下代码直接翻译拉丁宽字母表:
dt <- c('SemanticMediaWikiPAUXIkeWiki')

stringi::stri_trans_general(dt, "latin-ascii")

答案与上述相同。

关于在 R 中使用正则表达式序列进行正则表达式数据清除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42685988/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com