Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
文本挖掘R包&;正则表达式处理替换智能卷曲引号_R_Regex_Text Mining - Fatal编程技术网

文本挖掘R包&;正则表达式处理替换智能卷曲引号

文本挖掘R包&;正则表达式处理替换智能卷曲引号,r,regex,text-mining,R,Regex,Text Mining,我有一堆这样的文本,下面有不同的智能引号-单引号和双引号。我所知道的所有软件包的最终结果都是删除这些字符,但我希望用普通引号替换它们 textclean::replace_non_ascii("You don‘t get “your” money’s worth") 收到的输出:“你的钱没有价值” 预期输出:“你没有得到”你的“钱的价值” 如果有人能用正则表达式一次性替换所有这样的引用,我也会很感激的 谢谢 我们可以在这里使用gsub作为基本R选项。每次替换每个卷曲引用的术语 text <

我有一堆这样的文本,下面有不同的智能引号-单引号和双引号。我所知道的所有软件包的最终结果都是删除这些字符,但我希望用普通引号替换它们

textclean::replace_non_ascii("You don‘t get “your” money’s worth")
收到的输出:
“你的钱没有价值”

预期输出:
“你没有得到”你的“钱的价值”

如果有人能用正则表达式一次性替换所有这样的引用,我也会很感激的


谢谢

我们可以在这里使用
gsub
作为基本R选项。每次替换每个卷曲引用的术语

text <- "You don‘t get “your” money’s worth"
new_text <- gsub("“(.*?)”", "\"\\1\"", text)
new_text <- gsub("’", "'", new_text)
new_text
[1] "You don‘t get \"your\" money's worth"

text使用两个
gsub
操作:1)替换双引号,2)替换单引号:

> gsub("[“”]", "\"", gsub("[‘’]", "'", text))
[1] "You don't get \"your\" money's worth"
ʻ  02BB  MODIFIER LETTER TURNED COMMA
ʼ  02BC  MODIFIER LETTER APOSTROPHE
ʽ  02BD  MODIFIER LETTER REVERSED COMMA
٬  066C  ARABIC THOUSANDS SEPARATOR
‘  2018  LEFT SINGLE QUOTATION MARK
’  2019  RIGHT SINGLE QUOTATION MARK
‚  201A  SINGLE LOW-9 QUOTATION MARK
‛  201B  SINGLE HIGH-REVERSED-9 QUOTATION MARK
՚   055A  ARMENIAN APOSTROPHE
︐  FE10  PRESENTATION FORM FOR VERTICAL COMMA
看。在Linux和Windows中测试,效果相同

[“”]
构造是一个正数,它匹配类中定义的任何单个字符

要规范化所有类似双引号的字符,您可能需要使用

> sngl_quot_rx = "[ʻʼʽ٬‘’‚‛՚︐]"
> dbl_quot_rx = "[«»““”„‟≪≫《》〝〞〟\"″‶]"
> res = gsub(dbl_quot_rx, "\"", gsub(sngl_quot_rx, "'", `Encoding<-`(text, "UTF8"))) 
> cat(res, sep="\n")
You don't get "your" money's worth
[ʻʽ٬'''.'՚﷬]
用于规范化一些类似于单引号的字符:

> gsub("[“”]", "\"", gsub("[‘’]", "'", text))
[1] "You don't get \"your\" money's worth"
ʻ  02BB  MODIFIER LETTER TURNED COMMA
ʼ  02BC  MODIFIER LETTER APOSTROPHE
ʽ  02BD  MODIFIER LETTER REVERSED COMMA
٬  066C  ARABIC THOUSANDS SEPARATOR
‘  2018  LEFT SINGLE QUOTATION MARK
’  2019  RIGHT SINGLE QUOTATION MARK
‚  201A  SINGLE LOW-9 QUOTATION MARK
‛  201B  SINGLE HIGH-REVERSED-9 QUOTATION MARK
՚   055A  ARMENIAN APOSTROPHE
︐  FE10  PRESENTATION FORM FOR VERTICAL COMMA

{proustr}中有一个函数用于规范标点符号,名为
pr\u normalize\u punc()

结果是:

 => ″‶«  »“”`´„“ into "
 => ՚ ’ into ' 
 => … into ...
例如:

library(proustr)
a <- data.frame(text = "Il l՚a dit : « La ponctuation est chelou » !")
pr_normalize_punc(a, text)
# A tibble: 1 x 1
                                            text
*                                          <chr>
1 "Il l'a dit : \"La ponctuation est chelou\" !"
库(proustr)


a感谢您的回答,它仍然保留了单引号:-/。我在您的问题或样本数据中没有看到任何单引号。我怎么能编码到我看不见的东西?老鼠…我现在看到了…让我更新。我在一部手机上,屏幕很小。这给人留下了深刻的印象——用手机写字@amrrs强迫症更准确。我有一个栈瘾:-如果你只想将引号规范化为
”,你不需要使用捕获组/反向引用。使用
gsub(“[”“]”,“\”,text)
@WiktorStribiżew,但这会假设OP想要替换所有的卷曲引号,即使不围绕单词。@TimBiegeleisen这正是OP在清理文本时所做的。正在规范化所有引号。很抱歉之前没有明确说明@WiktorStribiżew是对的!感谢您的响应,当只传递一个字符串时,它就工作了,但当传递一个字符向量时,它会看到失败,不确定是否与我的R环境有关。用它更新了问题。请检查一下好吗?好的,请稍候,我正在添加更多详细信息。很抱歉,这似乎是我的会话问题。我重新启动了Rstudio,它工作正常。我只是更新你的答案(而不是将其标记为答案),因为我想知道是否有任何文本挖掘包可以在运行中这样做(不需要我们明确定义符号)。谢谢你的帮助@amrrs终于明白了,编码问题才是罪魁祸首。我更新了答案。此外,R似乎将
”视为常规ASCII
,所以我逃过了它。至于任何库,我知道没有一个库规范化引号。好的,今天我了解了,但它不是一个通用的引号规范化库。我认为最好的解决方案是我建议的定制方法。我在我的建议中添加了该软件包中的双引号和单引号。似乎不起作用:`>pr\u normalize\u punc(data.frame(text=new\u text),text)#tible:5 x 1 text*1“你没有得到你的钱\u0092t”2“你没有得到你的钱\u0092t得到你的钱\u0092s的价值”3“你没有得到你的钱\u0092t得到你的钱\u0092s的价值”4“你没有得到你的钱\u0092s的价值”5“你没有得到你的钱\u0092t得到你的钱\u0092s的价值”`奇怪,这是在我的机器上工作(检查我的答案更新)。你的操作系统是什么?我想这与系统语言环境有关,你可能在英语以外的语言环境中,我的语言环境是英语。@amrrs该库仅适用于法语,请参阅
pr\u normalize\u punc
函数描述:规范使用常用法语标点符号编写的文本。显示双引号模式是
(“|”-8246;«|«|«|“|”«|“|”«»»»»»»»»代码>(请注意V形符号旁边的空格!),单引号模式仅处理3个字符,
(՚|»65004;»)
。我还认为
`
'
看起来更像单引号。R在Windows上处理本机文本有缺陷。请参阅,例如,使用
text=utf8::as_utf8(“你没有得到“你的”钱的价值”)
来解决该缺陷。