【问题标题】:Remove unicode <+f0b7> from Corpus text从语料库文本中删除 unicode <+f0b7>
【发布时间】:2014-06-10 17:56:53
【问题描述】:

我遇到了一个非常顽固的问题...我似乎无法从 Corpora 中删除已从 *.txt 文件加载到 R 中的 &lt;+f0b7&gt;&lt;+f0a0&gt; 字符串:

更新这是示例.txt文件的链接:https://db.tt/qTRKpJYK

Corpus(DirSource("./SomeDirectory/txt/"), readerControl = list(reader = readPlain))

title
 professional staff - contract - permanent position
software c microfocus cobol unix btrieve ibm vm-cms vsam cics jcl
accomplishments
 <+f0b7>
<+f0a0>
responsible maintaining billing system interfaced cellular switching system <+f0b7>
<+f0a0>
developed unix interface ibm mainframe ericsson motorola att cellular switches

我已尝试将其添加到:

badWords <- unique(c(stopwords("en"), 
          stopwords("SMART")[stopwords("SMART") != "c"],
          as.character(1970:2050),
          "<U+F0B7>", "<+f0b7>",
          "<U+F0A0>", "<+f0a0>",
          "january",  "jan",
          "february",   "feb",
          "march",  "mar",
          "april",  "apr",
          "may",    "may",
          "june",   "jun",
          "july",   "jul",
          "august", "aug",
          "september",  "sep",
          "october",    "oct",
          "november",   "nov",
          "december",   "dec"))

并使用:

tm_map(candidates.Corpus, removeWords, badWords)

但这无论如何都行不通。我还尝试使用 gsub("&lt;+f0a0&gt;", "", tmp, perl = FALSE) 之类的东西对其进行正则表达式,这适用于 R 中的字符串,但不知何故,当我读取 .txt 文件时,这些字符仍然出现。

这些角色有什么独特之处吗?我该如何摆脱它们?

【问题讨论】:

  • 那么您是说字符串"&lt;U+F0B7&gt;" 出现在您的文本中,还是说Unicode 字符&lt;U+F0B7&gt; 出现在您的文本中? R 是否将此值打印到屏幕上?
  • 当我inspect() Corpus 元素时,R 实际上将这个值打印到我的屏幕上。
  • 请提供数据以重现此错误。
  • 抱歉耽搁了,这里是一个示例 .txt 文件的链接:db.tt/qTRKpJYK

标签: r tm


【解决方案1】:

好的。问题是您的数据中有一个不寻常的 unicode 字符。在 R 中,我们通常将此字符转义为“\uf0b7”。但是当inspect() 打印它的数据时,它会将其编码为“”。观察

sample<-c("Crazy \uf0b7 Character")
cp<-Corpus(VectorSource(sample))
inspect(DocumentTermMatrix(cp))

# A document-term matrix (1 documents, 3 terms)
# 
# Non-/sparse entries: 3/0
# Sparsity           : 0%
# Maximal term length: 9 
# Weighting          : term frequency (tf)
# 
#     Terms
# Docs <U+F0B7> character crazy
#    1        1         1     1

(实际上我必须在运行 R 3.0.2 的 Windows 机器上创建此输出 - 它在运行 R 3.1.0 的 Mac 上运行良好)。

不幸的是,您将无法使用 remove words 来删除它,因为该函数中使用的正则表达式要求单词边界出现在“单词”的两侧,而且这似乎不是一个可识别的字符边界。见

gsub("\uf0b7","",sample)
# [1] "Crazy  Character"
gsub("\\b\uf0b7\\b","",sample)
#[1] "Crazy  Character"

所以我们可以编写我们自己的函数,我们可以使用tm_map。考虑

removeCharacters <-function (x, characters)  {
gsub(sprintf("(*UCP)(%s)", paste(characters, collapse = "|")), "", x, perl = TRUE)
}

这基本上是没有边界条件的 removeWords 函数。然后我们就可以运行了

cp2 <- tm_map(cp, removeCharacters, c("\uf0b7","\uf0a0"))
inspect(DocumentTermMatrix(cp2))

# A document-term matrix (1 documents, 2 terms)
# 
# Non-/sparse entries: 2/0
# Sparsity           : 0%
# Maximal term length: 9 
# Weighting          : term frequency (tf)
# 
#     Terms
# Docs character crazy
#    1         1     1

我们看到那些 unicode 字符不再存在了。

【讨论】:

  • 伙计,你救了我。我遇到了 U+2007 的问题。有趣的是,为什么被称为“图形空间”(fileformat.info/info/unicode/char/2007/index.htm)的U+2007 不能与gsub("\\s+", "", x) 之类的东西一起使用?也许空间!=空间。任何其他 gsub 技巧都不起作用,但你的函数做到了。谢谢!
猜你喜欢
  • 1970-01-01
  • 2014-12-31
  • 2013-08-11
  • 1970-01-01
  • 2019-04-09
  • 2016-01-08
  • 2019-01-17
  • 2016-04-11
  • 1970-01-01
相关资源
最近更新 更多