使用索引数据计算非结构化文档中的所有唯一单词

2024-02-16

我已将非结构化 HTML 文档加载到 Marklogic 中,并且, 对于任何给定的文档 URI,我需要一种使用索引/词典来提供所有唯一单词的字数统计的方法。

例如,假设我有以下文件,保存在 URI“/html/example.html”下:

<html>
<head><title>EXAMPLE</title></head>
<body>
<h1>This is a header</h1>
<div class="highlight">This word is highlighted</div>
<p> And these words are inside a paragraph tag</p>
</body>
</html>

在 XQuery 中,我将通过传入 URI 来调用传入 a 的函数,并获得以下结果:

EXAMPLE 1
This 2
is 2
a 2
header 1
word 1
highlighted 1
And 1
these 1
words 1
are 1
inside 1
paragraph 1
tag 1

请注意,我只需要对标签内的单词进行字数统计,而不需要对标签本身进行字数统计。

有什么方法可以有效地做到这一点(使用索引或词典数据?)

Thanks,

grifster


您要求“对于任何给定的文档 URI”进行字数统计。但是您假设解决方案涉及索引或词典,这不一定是一个好的假设。如果您想要从面向文档的数据库中获取特定于文档的内容,通常最好直接处理文档。

因此,让我们专注于单个文档的高效字数统计解决方案,然后从那里开始。好的?

以下是我们如何获取单个元素(包括所有子元素)的字数统计。这可能是您文档的根目录:doc($uri)/*.

declare function local:word-count($root as element())
as map:map
{
  let $m := map:map()
  let $_ := cts:tokenize(
    $root//text())[. instance of cts:word]
    ! map:put($m, ., 1 + (map:get($m, .), 0)[1])
  return $m
};

这会生成一个地图,我发现它比平面文本更灵活。每个键是一个单词,值是计数。变量$doc已经包含您的示例 XML。

let $m := local:word-count($doc)
for $k in map:keys($m)
return text { $k, map:get($m, $k) }

inside 1
This 2
is 2
paragraph 1
highlighted 1
EXAMPLE 1
header 1
are 1
word 1
words 1
these 1
tag 1
And 1
a 2

请注意,映射键的顺序是不确定的。添加一个order by如果您愿意的话。

let $m := local:word-count($doc)
for $k in map:keys($m)
let $v := map:get($m, $k)
order by $v descending
return text { $k, $v }

如果要查询整个数据库,Geert 的解决方案使用cts:words可能看起来不错。它使用词典作为单词列表,并使用一些索引查找来进行单词匹配。但它最终会为每个单词词典单词的每个匹配文档遍历 XML:O(nm)。为了正确地做到这一点,代码必须做类似的工作local:word-count确实如此,但一次只能说一个词。许多单词将匹配相同的文档:“the”可能在 A 和 B 中,“then”也可能在 A 和 B 中。尽管使用了词典和索引,但通常这种方法会比简单应用慢local:word-count到整个数据库。

如果您想要查询整个数据库并愿意更改 XML,您可以将每个单词包装在一个word元素(或任何您喜欢的元素名称)。然后创建一个字符串类型的元素范围索引word。现在你可以使用cts:values and cts:frequency直接从范围索引中提取答案。这将是 O(n),成本比cts:words方法,并且可能比local:word-count,因为根本不会访问任何文档。但生成的 XML 相当笨拙。

我们回去申请吧local:word-count到整个数据库。首先调整代码,以便调用者提供地图。这样我们就可以构建一个包含整个数据库字数的地图,并且我们只查看每个文档一次。

declare function local:word-count(
  $m as map:map,
  $root as element())
as map:map
{
  let $_ := cts:tokenize(
    $root//text())[. instance of cts:word]
    ! map:put($m, ., 1 + (map:get($m, .), 0)[1])
  return $m
};

let $m := map:map()
let $_ := local:word-count($m, collection()/*)
for $k in map:keys($m)
let $v := map:get($m, $k)
order by $v descending
return text { $k, $v }

在我的笔记本电脑上,它在不到 100 毫秒的时间内处理了 151 个文档。大约有 8100 个单词和 925 个不同的单词。得到相同的结果cts:words and cts:search花费了不到 1 秒的时间。所以local:word-count效率更高,并且对于这项工作来说可能足够高效。

既然您可以高效地构建字数统计图,那么如果您可以保存它呢?本质上,您将建立我们自己的字数统计“索引”。这很容易,因为地图具有 XML 序列化。

(: Construct a map. :)
map:map()
(: The document constructor creates a document-node with XML inside. :)
! document { . }
(: Construct a map from the XML root element. :)
! map:map(*)

所以你可以打电话local:word-count在插入或更新每个新 XML 文档时。然后将字数统计图存储在文档的属性中。使用 CPF 管道、通过 RecordLoader 使用您自己的代码或在 REST 上传端点等中执行此操作。

当您想要单个文档的字数统计时,只需调用xdmp:document-properties or xdmp:document-get-properties,然后调用map:map右侧 XML 上的构造函数。如果您需要多个文档的字数统计,您可以轻松编写 XQuery 将这些映射合并为单个结果。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用索引数据计算非结构化文档中的所有唯一单词 的相关文章

  • 避免 XDMP-EXPNTREECACHEFULL 并加载文档

    我正在使用 marklogic 4 并且有大约 15000 个文档 每个文档大约 10 KB 我想将整个内容作为文档加载 并将所有文档转换为单个 csv 文件并输出到 HTTP 输出流以供下载 当我以这种方式加载文档时 let uri ct
  • 如何使用 xQuery 对转义的 XML 进行取消编码

    我在 xQuery 中有一个类型为 xs string 的变量 其值为编码的 HTML 片段 twitter 推文的内容 它看起来像这样 今日头条美联社来源 b 奥巴马 b 挑选 司法职位撤回 新闻 休息 世界 http shar es m
  • 在 MarkLogic 8 中调用具有来自其余端点的依赖项的 xquery 库

    我们正在从 MarkLogic 6 升级到 8 并且在调用库模块时遇到了一些问题 我们有 xquery 库模块 可以从自定义 REST 扩展和非 REST xquery 调用 马克逻辑公司文档表示 REST 端点可以使用通过新 ext 端点
  • MarkLogic 连接查询

    您好 我是 marklogic 和 Xquery 世界的新手 我无法想到在 Marklogic Xquery 中编写以下逻辑的起点 如果有人能给我想法 样本 我将不胜感激 以便我可以实现以下目标 我想根据 B XML 中的单词查找来查询 A
  • 使用 Logstash,如何根据每行匹配相同的时间戳来组合行?

    MarkLogic 日志文件通过打印具有相同时间戳 精确到毫秒 的行来表示多行 您可以在这段代码中看到这一点 2014 05 09 18 47 33 844 Info Dev Xdbc file store get file xqy url
  • 如何高效替换XML的多个节点?

    我试图一次性替换单个文档的大约 500 个节点 并且我的数据库中有 5000 多个文档 我正在使用的代码与我之前问过的这个问题相关 Link https stackoverflow com questions 51998598 how to
  • marklogic mlcp 自定义转换拆分聚合文档为多个文件

    我有一个 JSON 聚合 文件 我想使用 mlcp 将其拆分并作为多个文档摄取到 MarkLogic 中 我想要使用 javascript 在摄取过程中转换内容 http docs marklogic com guide mlcp impo
  • ms-excel 兼容的 csv 文件,代表 MarkLogic 目录中的所有文档

    我怎样才能最好地制作一个MS Excel兼容的csv代表 MarkLogic 目录中所有文档的文件 使用XCCJava 客户端和Tomcat and Marklogic两者都位于偏远地区 目录中的文档数量约为15000个 第一部分 获取目录
  • Marklogic:导入 csv 时在文档上创建多个 XML 文件。如何获取根文档 URI 路径?

    我是 Marklogic 的新手 我尝试将 100k 记录的 CSV 文件导入到 Marklogic 导入后 我发现它默认导入到文档数据库 另外 我发现对于每条记录 我都会看到数据库中生成的 XML 文件 其中增量编号附加到我在导入时提到的
  • 在 Marklogic Javascript 中实现 For 循环?

    我可以使用下面的 XQuery 获取集合中文档的所有 URI for doc in fn collection transform return xdmp node uri doc 但是 当我尝试在 MarkLogic 的 Javascri
  • MarkLogic - 带有 REST API 的 CORS

    我有一个基于 MarkLogic 的 Web 应用程序 它从两个源提取数据 一个文档存储和一个三重存储 两者都托管在我的 MarkLogic 服务器上 该应用程序使用 MarkLogic 的内置 REST API 来访问这些数据存储 文档存
  • 在 MarkLogic 中处理禁运内容场景

    我有一个 MarkLogic 7 数据库 其中插入了多个文档 每个文档都有自己的created on and released on 举例来说 如果将文档插入到数据库中1400小时及其released on值为1700小时然后我需要将此文档
  • MarkLogic 9 cts.parse 无法正确解析查询

    我正在使用 MarkLogic 9 开发基于 Web 的搜索应用程序 我有一个查询构建界面 允许用户将字符串输入到与数据库中文档的特定 JSON 属性相对应的文本框中 这个想法是 用户可以完全按照 cts parse 我使用服务器端 jav
  • 跨集群访问日志

    我有一个包含 3 个节点的集群 我已经配置了应用程序服务器的数据库 我想知道集群中各主机生成的访问日志是否相同 或者每个主机都有一个单独的 访问日志 用于记录对其主机的请求 我知道集群中的每个主机都维护自己的审核日志文件 访问日志的工作方式
  • 尝试运行 XQuery 脚本以单点登录 MarkLogic 时出错

    我正在研究使用 xquery 重写器脚本来自动登录单点登录解决方案 我从端口 8001 的管理应用程序服务器开始 在应用程序服务器配置中 我有 设置身份验证 application level 设置 url 重写器 rewriter xqy
  • 如何获取Marklogic数据库中的文档总数?

    我在 Marklogic 数据库中有大约 20 个 lacs 文档 我想要我的搜索应用程序中的文档总数进行分页 为了获得我正在使用的总数 xdmp estimate cts search doc query 其中 query 是各种查询的组
  • 使用索引数据计算非结构化文档中的所有唯一单词

    我已将非结构化 HTML 文档加载到 Marklogic 中 并且 对于任何给定的文档 URI 我需要一种使用索引 词典来提供所有唯一单词的字数统计的方法 例如 假设我有以下文件 保存在 URI html example html 下 h1
  • 有没有查看/编辑/删除Marklogic文档的工具

    有没有什么工具可以view edit deleteMarklogic 的文档 比如 Mongo Management Studio for MongoDb MarkLogic 内置了对 WebDav 的支持 您可以在管理控制台中创建 Web
  • 如何使用marklogic数据库进行数据实时处理

    我正在尝试评估数据实时处理的标记逻辑 早些时候 我使用 kafka 和 Storm 来实时处理数据 并在处理后插入到数据库中 我是 marklogic 的新手 所以有人可以告诉我 marklogic 中是否有任何可用的东西 我可以使用它来实
  • 在大型数据库上使用谓词?

    我有一个包含 50 000 000 个文档的数据库 我想将每个文档的 base uri 写入一个文件 运行整个 50 000 000 次运行时间太长 查询超时 所以 我想我应该使用谓词将数据库分成更易于管理的批次 因此 我尝试了以下方法来了

随机推荐

  • 如何使用 Python、PyQt5 和 Pyinstaller 修复未正确显示的按钮

    I created an interface using Qt Designer and integrated it into my python code using PyQt5 I then created an exe file us
  • 无法从内容页面访问内容控件?

    我的内容页面如下所示
  • 安卓; “密钥发送超时……”

    我有一个菜单活动和一个从菜单启动的游戏活动 有些 大多数 时间我启动游戏活动 所有输入都会挂起几秒 最多 10 秒 然后在 logcat 中得到以下信息时以超高速播放 11 20 18 24 27 873 WARN WindowManage
  • 撤销授予我的应用 Google Drive API 的访问权限

    如何撤销已授予我的 Google 云端硬盘网络应用程序的访问权限 以便在用户下次使用时重新请求权限 要撤销您的访问令牌 您需要 GET 此网址 https accounts google com o oauth2 revoke token
  • Android:意图过滤器验证失败

    我的目标是让 Android 自动打开任何以test touchwonders com在我的应用程序中 我已将所需的文件放在我的服务器上 https test touchwonders com well known assetlinks j
  • Express 在 url 末尾奇怪地添加斜杠

    我正在使用 Node js 和 Express 框架来开发网站 我遇到了 url 的奇怪行为 当我单击相关链接 url 时 url 变为 localhost 3000 images 如您所见 末尾添加了斜杠 但是当我将所有 图像 更改为 i
  • Quarkus 异常处理程序

    quarkus 提供异常处理程序吗 我想要像 Spring 的 ControllerAdvice 这样的东西 https www baeldung com exception handling for rest with spring ht
  • 渲染自定义属性 KNP 菜单

    有没有办法在 KNP 菜单包中呈现自定义属性 如下所示 menu factory gt createItem Role ROLE PROGRAM EVENT PLANNER array route gt show form events a
  • 同步并发请求以共享缓慢操作的结果

    我有一个 Java UI 服务 它有一个 API 方法 该方法调用一个相对较慢的操作 比如大约 30 秒 该操作是无参数的 但它对随时间变化 相对缓慢 的外部数据进行操作 该方法返回最新结果并不重要 如果它们是 30 秒的旧结果 那就可以接
  • 如何将 PHP in_array 与关联数组一起使用?

    是否有任何php函数 例如in array 用于通过mysql函数 mysql fetch assoc 获得关联数组 例如 如果我有一个如下所示的 array array 0 gt array ID gt 1 name gt Smith 1
  • 在 HTML 与 CSS 中指定页面加载的图像尺寸

    我很久以前就从某个地方了解到 指定宽度和高度 img HTML 文档中的元素可以加快并改善页面加载体验 并且通常遵循以下做法 img src width 100 height 100 我现在面临的情况是 单个页面上有大量图像 我更喜欢通过
  • 从 Azure VM 打开活动 FTP 连接

    我正在尝试通过 Azure VM 的活动连接连接到远程 FTP 服务器 我收到的错误是 非法 PORT 命令 我使用被动连接连接到其他 FTP 站点没有问题 但此 FTP 服务器仅支持主动连接 我的问题基本上与这个问题 https serv
  • 如何使用php从周数中查找月份号、名称

    如何使用php从周数中查找月份号 名称 如果您有ISO week http en wikipedia org wiki ISO week date数字 然后获取您可以使用的月份 一周的开始 strtotime http php net st
  • 事务管理和 CDI

    我想用CDI 我通常使用Spring 开发一个应用程序来发现这项技术 我读过很多关于 CDI 的文章来了解它是如何工作的 我有一个关于事务管理的简单问题 例如数据库中的持久性 是否必须使用 EJB 3 1 来进行事务管理 或者是否可以仅使用
  • R 闪亮的数据表列用线分割

    我在闪亮的服务器中生成一个数据表 如下所示 x renderTable rownames FALSE 并有一个像这样的用户界面 tableOutput x 现在我希望每隔一列就有一个分割标记为线条 例如 a b c d e 1 2 2 3
  • 了解 XDR 规范以创建 *.x 文件

    我浏览了互联网上的几个网站 实际上想知道我们如何在规范中编写规范 x文件以生成等效函数 通常 您可以从 x 文件生成三 组 代码 消息 xdr 编码器 解码器函数 客户端存根和服务器存根 当然 您也可以手动完成 但要做到正确的工作量太大 使
  • 如何从文件名中删除文件扩展名(VBA)

    我有一个文件名变量 其中包含 Filename csv 要从我使用的路径中提取文件名 Filename Dir fStr where fStr从我选择的文件中检索 我只需要文件名而不需要 csv 我该如何删除 csv 扩大 最好使用类似的函
  • 如何使用 传递附加信息?

    我需要将文件上传到在 tomcat 上运行的 servlet 除了文件之外 我还想允许用户添加与上传的文件关联的评论 我尝试了以下方法 但没有成功
  • bluez5 中哪个工具取代了 gatttool?

    好像自从commit b1eb2c4cd057624312e0412f6c4be000f7fc3617 gatttool已被弃用 但我找不到任何信息 什么取代了 gattool 我在 gatttool 上研究过的每个 Python 蓝牙 L
  • 使用索引数据计算非结构化文档中的所有唯一单词

    我已将非结构化 HTML 文档加载到 Marklogic 中 并且 对于任何给定的文档 URI 我需要一种使用索引 词典来提供所有唯一单词的字数统计的方法 例如 假设我有以下文件 保存在 URI html example html 下 h1