- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经将非结构化的 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
请注意,我只需要对标签内的单词进行字数统计,而不是对标签本身进行统计。
有什么方法可以有效地做到这一点(使用索引或词典数据?)
谢谢,
小偷
最佳答案
您要求“针对任何给定文档 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
};
这会生成一个 map ,我发现它比平面文本更灵活。每个键是一个词,值是计数。变量 $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
请注意, map 键的顺序是不确定的。如果您愿意,可以添加一个 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 更慢:整个数据库的字数
。
如果您想查询整个数据库并愿意更改 XML,您可以将每个单词包装在 word
元素(或您喜欢的任何元素名称)中。然后在word
上创建一个字符串类型的元素范围索引。现在您可以使用 cts:values
和 cts:frequency
直接从范围索引中提取答案。这将是 O(n),成本比 cts:words
方法低得多,并且可能比 local:word-count
更快,因为不会访问任何文档根本。但是生成的 XML 非常笨拙。
让我们回过头来将 local:word-count
应用于整个数据库。首先调整代码,以便调用者提供 map 。这样我们就可以构建一个包含整个数据库字数统计的 map ,并且我们只查看每个文档一次。
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
和 cts:search
获得相同的结果只用了不到 1 秒。所以 local:word-count
效率更高,而且可能足以胜任这项工作。
既然您可以高效地构建字数统计图,那么如果可以保存它呢?本质上,您将建立我们自己的字数统计“索引”。这很容易,因为 map 具有 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(*)
因此您可以在插入或更新每个新 XML 文档时调用 local:word-count
。然后将字数统计表存储在文档的属性中。使用 CPF 管道,或通过 RecordLoader 使用您自己的代码,或在 REST 上传端点等中执行此操作。
当您需要单个文档的字数统计时,只需调用 xdmp:document-properties
或 xdmp:document-get-properties
,然后调用 map:map
右侧 XML 的构造函数。如果您想要对多个文档进行字数统计,您可以轻松编写 XQuery 以将这些映射合并为一个结果。
关于marklogic - 使用索引数据计算非结构化文档中的所有唯一单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25403223/
这几天我一直在努力。我一直在自学 CSS,所以对菜鸟好一点。我正在创建一个推荐 slider 。推荐以 3 个 block 显示。我希望前 2 个下降,第 3 个上升。但是当 slider 激活时,无
我最近开始学习 Nodejs,现在我很困惑我的网络应用程序使用什么,html 还是 ejs (Express)。 Ejs 使用 Express 模块,而 .html 使用 HTML 模块。我的第一个问
假设我们有一个 PostgreSQL 表contacts,每条记录都有一堆带标签的电子邮件地址(标签和电子邮件对)——其中一个是“主要”。 存储方式如下: id 主键 电子邮件 文本 email_la
我成功为一种新的tesseract语言编写了traineddata文件,但是当我完成时,我继续收到以下错误: index >= 0 && index = 0 && 索引 < size_used_ :E
这个问题已经有答案了: How to deal with SettingWithCopyWarning in Pandas (21 个回答) 已关闭 4 年前。 假设我有一个像这样的数据框,第一列“密
如果我有一个位置或行/列同时用于 A 和 B 位置,请检查 B 是否与 A 成对角线? 1 2 3 4 5 6 7 8 9 例如,我如何检查 5 是否与 7 成对角线? 此外,如果我检查 4 是
MongoDB:索引 一、 创建索引 默认情况下,集合中的_id字段就是索引,我们可以通过getIndexes()方法来查看一个集合中的索引 > db.user.getIndexes() [ { "v
一、索引介绍 索引是一种用来快速查询数据的数据结构。 B+Tree就是一种常用的数据库索引数据结构,MongoDB采用B+Tree 做索引,索引创建在colletions上。 MongoDB不使用索引
我无法决定索引。 就像我有下面的查询需要太多时间来执行: select count(rn.NODE_ID) as Count, rnl.[ISO_COUNTRY_CODE] as Cou
我有这些表: CREATE TABLE `cstat` ( `id_cstat` bigint(20) NOT NULL, `lang_code` varchar(3) NOT NULL,
我正在尝试找到一种方法来提高包含 IP 范围的 mysql 表的性能(在高峰时段每秒最多有 500 个 SELECT 查询(!),所以我有点担心)。 我有一个这种结构的表: id smallint(
jquery index() 似乎无法识别元素之一,总是说“无法读取未定义的属性‘长度’”这是我的代码。mnumber 是导致问题的原因。我需要 number 和 mnumber 才能跟踪使用鼠标,并
我们有一个包含近 4000 万条记录的 MongoDB 集合。该集合的当前大小为 5GB。此集合中存储的数据包含以下字段: _id: "MongoDB id" userid: "user id" (i
文档说:如果你有多个字段的复合索引,你可以用它来查询字段的开始子集。所以如果你有一个索引一个,乙,丙你可以用它查询一种一个,乙a,b,c 我的问题是,如果我有一个像这样的复合索引一个,乙,丙我可以查询
我正在使用 $('#list option').each(function(){ //do stuff }); 循环列表中的选项。我想知道如何获取当前循环的索引? 因为我不想让 var i = 0;循
MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。 打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL
SQLite 索引(Index) 索引(Index)是一种特殊的查找表,数据库搜索引擎用来加快数据检索。简单地说,索引是一个指向表中数据的指针。一个数据库中的索引与一本书后边的索引是非常相似的。
我是 RavenDB 的新手。我正在尝试使用多 map 索引功能,但我不确定这是否是解决我的问题的最佳方法。所以我有三个文件:Unit、Car、People。 汽车文件看起来像这样: { Id: "
我有以下数据,我想根据范围在另一个表中建立索引 我想要实现的是,例如,如果三星的销售额为 2500,则折扣为 2%,低于 3000 且高于 1000 我知道它可以通过索引来完成,与多个数组匹配,然后指
我正在检查并删除 SQL 数据库中的重复和冗余索引。 所以如果我有两个相同的索引,我会删除。 例如,如果我删除了重叠的索引... 索引1:品牌、型号 指标二:品牌、型号、价格 我删除索引 1。 相同顺
我是一名优秀的程序员,十分优秀!