我想从marklogic中的xml文档数据库中删除标点符号。这是为了机器学习的预处理目的。我是marklogic的新手,我不知道如何做到这一点。是否有可以删除标点符号的xquery查询?
答案 0 :(得分:1)
要对数据库中的所有文本进行批量替换,并取出标点符号,您可以从看起来像此代码的内容开始(根据您的需要进行修改):
for $doc in cts:search(fn:collection(), ())
for $text in $doc//text()
return xdmp:node-replace($text, text{fn:replace($text, "[\.,;]", "")})
答案 1 :(得分:1)
说实话,这个任务对源文本文件本身来说要便宜得多 - 或者在MarkLogic中通过在替换过程中将XML视为字符串来实现。一次更新节点一个元素将是昂贵的。
Marklogic之外:
使用SED或AWK或类似的工具BEFORE INGESTION
MarkLogic内部(可能是触发器)
使用xdmp:quote将XML更改为字符串,然后用fn:replace替换,然后使用xdmp:unquote
let $new-doc := xdmp:unquote(fn:replace(xdmp:quote($doc), "[\.,;]", ""))
然后通过用xdmp:node-replace替换根节点来存储,或者将此版本存储为属性。这一切都取决于原件(标点版本对您而言重要)。或许您只想保留原件并将此清洁版本提供给某人。
在上述所有情况下,您必须确保您的替换不会谋杀您的XML。另外,请注意上述功能的选项(例如如何处理cdata。
最后,“这是出于机器学习目的”。你没有详细说明。我想我们这里的许多人都有这种解决方案(在插入之前清理标点符号)与MarkLogic的细微差别 - 你在存储然后拥有令人敬畏的索引,令牌化,阻止,整理,搜索支持以根据需要查找和返回您的数据。如果您稍微详细说明一下您的用例,您可能会激励其他人提供更多MarkLogic特定的建议。
答案 2 :(得分:1)
如果您在'punctuation-insensitive'
'diacritic-insensitive'
和cts:element-word-query()
,则可以使用
答案 3 :(得分:0)
我不确定这是否是您所要求的,但在技术上可以更新数据库中的每个文档以删除标点符号;但是,它非常昂贵,我不推荐它。
使用内置搜索功能,您可以实现相同的目标,而无需通过查询标点符号不敏感来更新文档。例如,如果要选择标题与不区分大小写的字符串匹配的文档:
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