如何从 marklogic 中的数据库中删除标点符号?

How to remove punctuation from a database in marklogic?

我想从 marklogic 中 xml 文档的数据库中删除标点符号。这是为了机器学习的预处理目的而制作的。我是 marklogic 的新手,我不知道该怎么做。是否有可以删除标点符号的 xquery 查询?

我不确定这是否是您要问的,但技术上可以更新数据库中的每个文档以删除标点符号;但是,它非常昂贵,我不推荐它。

使用 built-in 搜索功能,您可以通过不区分标点符号的查询来实现相同的目标,而无需更新您的文档。例如,如果您想要 select 标题与不区分大小写的字符串相匹配的文档:

cts:search(//mydoc,
  cts:element-word-query(xs:QName('title'), 'Moby-Dick', 'punctuation-insensitive'))

或者在现有的 XQuery 中:

for $d in $documents
where cts:contains($d, 
  cts:element-word-query(xs:QName('title'), 'Moby-Dick', 'punctuation-insensitive'))
return $d/summary

要大量替换数据库中的所有文本并删除标点符号,您可以从类似以下代码(根据您的需要进行修改)开始:

for $doc in cts:search(fn:collection(), ())
    for $text in $doc//text()
        return xdmp:node-replace($text, text{fn:replace($text, "[\.,;]", "")})

老实说,在源文本文件本身或在 MarkLogic 中通过在替换过程中将 XML 视为字符串来执行该任务要便宜得多。一次更新节点一个元素会很昂贵

Marklogic 之外:
在摄取之前使用 SED 或 AWK 或类似工具

MarkLogic 内部(可能作为触发器)
使用 xdmp:quote to change the XML to a string, then replace in a sing with fn:replace and then make XML again with xdmp:unquote

let $new-doc := xdmp:unquote(fn:replace(xdmp:quote($doc), "[\.,;]", ""))

然后通过用 xdmp:node-replace 替换根节点来存储 - 或者将此版本存储为 属性。这一切都取决于原始版本(标点符号版本对您很重要)。或者您可能只是想保留原始版本并将此清理后的版本返回给某人。

在上述所有情况下,您必须确保您的替代者不会谋杀您的 XML。另外,请注意上述功能的选项(例如 cdata 的处理方式。


最后,"This is for machine learning purposes"。你不细说。我想我们这里的很多人都有一种感觉,这个解决方案(在插入之前清除标点符号)与 MarkLogic 的本质相冲突 - 在其中你 按原样存储 然后有很棒的索引,标记化、词干提取、整理、搜索支持以根据需要查找和 return 您的数据。如果您稍微详细说明您的用例,您可能会启发其他人提供更多 MarkLogic 特定建议。

如果您使用 'punctuation-insensitive' 并且如果在 cts:element-word-query()

中需要 'diacritic-insensitive',它将起作用