在XQuery中对多个值进行计数的最有效方法

布拉姆·范罗伊

我需要在荷兰语的XML语料库中查找1581个单词(5亿个单词)。该语料本身在许多数据库中均被拆分。(您可以在这里阅读原因。)我们使用BaseX作为服务器(版本7.9),它使用XQuery作为输入。

我有兴趣找出带有中性确定词(het)或非中性确定词(de的语料库中每个单词有多少次-这是通过寻找由NP(名词短语)组成的XPath结构来完成的,有两个女儿,一个是具有lemma dehet的确定者,另一个是我感兴趣的单词“团长”。

de的示例结构

/node[@cat="np" and node[@rel="det" and @pt="lid" and @lemma="de"] and node[@rel="hd" and @pt="n" and @word="accelerator"]]
/node[@cat="np" and node[@rel="det" and @pt="lid" and @lemma="de"] and node[@rel="hd" and @pt="n" and @word="accountant"]]
/node[@cat="np" and node[@rel="det" and @pt="lid" and @lemma="de"] and node[@rel="hd" and @pt="n" and @word="ace"]]
/node[@cat="np" and node[@rel="det" and @pt="lid" and @lemma="de"] and node[@rel="hd" and @pt="n" and @word="acroniem"]]

het的示例结构

/node[@cat="np" and node[@rel="det" and @pt="lid" and @lemma="het"] and node[@rel="hd" and @pt="n" and @word="accelerator"]]
/node[@cat="np" and node[@rel="det" and @pt="lid" and @lemma="het"] and node[@rel="hd" and @pt="n" and @word="accountant"]]
/node[@cat="np" and node[@rel="det" and @pt="lid" and @lemma="het"] and node[@rel="hd" and @pt="n" and @word="ace"]]
/node[@cat="np" and node[@rel="det" and @pt="lid" and @lemma="het"] and node[@rel="hd" and @pt="n" and @word="acroniem"]]

在XQuery中,然后对每个XPath结构这样做:

count(for $node in db:open("mydatabase")/treebank/tree/node[@cat="np" and node[@rel="det" and @pt="lid" and @lemma="het"] and node[@rel="hd" and @pt="n" and @word="accelerator"]] return $node)

这样很好。事实是,这需要很长时间。每次都需要顺序打开相同(数千个)的数据库,并且对每个单词重复此过程。我的问题是,没有办法串联一些查询。我有一些想法,但是我不确定如何执行它们-而且,我不确定BaseX可以处理多少个参数。

  1. 合并查询。

这可能是最直接的情况。这样,我至少将查询需求减少了一半。但是我不知道发现结果时如何区分两者。例如,如果我将XPath代码更改为:

... (@lemma="de" or @lemma="het") ...

我应该找到所有情况,但是如何区分一个或另一个呢?换句话说,如果我使用了XPath,我将得到计数功能XQuery中一个数回,但没有办法,我知道这是的,哪些是

  1. 相同的想法可以应用于末尾的单词属性

我可以对每个单词进行以下连接,而不是对每个单词执行新的查询:

... (@word="accelerator" or @word="accountant" or @word="ace" or ...) ...

但是,我又如何区分这些值?我可以将所有1581个值放在一个XPath中吗?BaseX可以处理吗?

  1. 一个带有单词列表的for循环,然后它将以XML格式返回很多单词的结果(如果BaseX可以处理,则可能全部返回)。

我不是XQuery的专家,但是在伪代码中,我猜可能是这样的:

$wordlist = ['accelerator', 'accountant', 'ace', 'acroniem'];
$determinerlist = ['de', 'het'];
$db = 'mydatabase';
foreach ($wordlist as $word) {
  foreach ($determinerlist as $det) {
    count(for $node in db:open("'.$db.'")/treebank/tree/node[@cat="np" and node[@rel="det" and @pt="lid" and @lemma="'.$det.'"] and node[@rel="hd" and @pt="n" and @word="'.$word.'"]] return $node);
  }
}

我不确定如何在XQuery中将计数分配给数组变量,但是XML输出看起来可能是这样的(当然,欢迎更好的变化):

<results>
  <result word="accelerator">
    <neuter>12</neuter>
    <nonneuter>3</nonneuter>
  </result>
  <result word="accountant">
    <neuter>4</neuter>
    <nonneuter>0</nonneuter>
  </result>
  <result word="ace">
    <neuter>14</neuter>
    <nonneuter>2</nonneuter>
  </result>
  <result word="acroniem">
    <neuter>3</neuter>
    <nonneuter>7</nonneuter>
  </result>
</results>

然后,我可以使用带有正则表达式或XML树枝的Perl来运行以获得所需的值。

如您所见,可能的问题是找到一个合适的XQuery代码,该代码高效,并且考虑到我有1581个单词要在庞大的语料库中查找,并且要通过的数据库数量也很多(千)。对于每个数据库查找,将通过Perl建立新的连接。

如果您有任何疑问,请发表评论,我会尽力回答。

滴滴

通常,如果您利用索引而不是使查询遍历一万亿个节点,那么BaseX查询将是最快的(通常是令人眼花fast乱的)。除非您已修改默认的数据库创建选项,否则默认情况下,BaseX会为您创建TEXT,ATTRIBUTE和TOKEN索引。(BaseX还会尝试重新编写查询以利用索引,尽管这种方法并不总是成功的)。

因此,假设您的数据库是使用ATTRIBUTE索引构建的,那么您应该能够按照以下方式重新编写查询:

db:attribute('dbname', 'accelerator', 'word')/parent::*

对于数据库'dbname',上面使用的db:attribute函数将返回任何以'accelerator'作为@word值的属性的父元素。显然,根据您先前的示例,可以根据需要根据这个查询进行查询。

db:attribute('dbname', 'accelerator', 'word')
      [parent::node[@rel="hd" and @pt="n"]]
      [ancestor::node
        [@cat="np"]
        [child::node[@rel="det" and @pt="lid" and @lemma="het"]
      ]
    ]

这是有关BaseX索引功能的良好文档。我使用它对大型(> 20 GB)数据库的快速查询有很大的作用。

http://docs.basex.org/wiki/索引

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在JavaScript中合并多个排序对象数组的最有效方法是什么?

来自分类Dev

在vb.net中对字节数组进行异或的最有效方法

来自分类Dev

从包含多个已排序运行的文件中检索行的最有效方法是什么

来自分类Dev

对语法VBA进行排序的最有效方法

来自分类Dev

在ScrollPane中包装GridPane或以编程方式对其进行修改。最有效的方法?

来自分类Dev

在Azure中管理多个租户存储的最有效方法?

来自分类Dev

从字符串中删除多个子字符串的最有效方法?

来自分类Dev

从对象列表中获取具有最大值的对象的最有效方法

来自分类Dev

在Java中同时对三个ArrayList进行排序的最有效方法是什么

来自分类Dev

在Firebase中增加所有值的最有效方法

来自分类Dev

从Python中的类方法返回多个值的最有效方法是什么?

来自分类Dev

检查多个项目是否存在的最有效方法

来自分类Dev

Python:对交易进行分类的最有效方法

来自分类Dev

使用和与多个线程通信的最有效方法

来自分类Dev

为多个ssh隧道设置最有效的方法?

来自分类Dev

通过wifi进行通讯的最有效方法

来自分类Dev

对文本值进行排序的最有效方法是什么?

来自分类Dev

在Matlab中读取多个.JPG文件的最有效方法是什么?

来自分类Dev

在ScrollPane中包装GridPane或以编程方式对其进行修改。最有效的方法?

来自分类Dev

在Rails中跨表/模型进行查询的最有效方法

来自分类Dev

在bash脚本中测试多个值的最有效方法是什么

来自分类Dev

从Python中的类方法返回多个值的最有效方法是什么?

来自分类Dev

在Bash中搜索文本文件中多个术语的最有效方法

来自分类Dev

在XQuery中对多个值进行计数的最有效方法

来自分类Dev

在Parse中对数据进行分组的最有效方法是什么?

来自分类Dev

用空值进行聚合的最有效方法是什么?

来自分类Dev

基于pandas中的两个条件进行分组和聚合的最有效方法

来自分类Dev

处理多个文件的最有效方法

来自分类Dev

在objective-c中对键值对进行排序的最有效方法

Related 相关文章

  1. 1

    在JavaScript中合并多个排序对象数组的最有效方法是什么?

  2. 2

    在vb.net中对字节数组进行异或的最有效方法

  3. 3

    从包含多个已排序运行的文件中检索行的最有效方法是什么

  4. 4

    对语法VBA进行排序的最有效方法

  5. 5

    在ScrollPane中包装GridPane或以编程方式对其进行修改。最有效的方法?

  6. 6

    在Azure中管理多个租户存储的最有效方法?

  7. 7

    从字符串中删除多个子字符串的最有效方法?

  8. 8

    从对象列表中获取具有最大值的对象的最有效方法

  9. 9

    在Java中同时对三个ArrayList进行排序的最有效方法是什么

  10. 10

    在Firebase中增加所有值的最有效方法

  11. 11

    从Python中的类方法返回多个值的最有效方法是什么?

  12. 12

    检查多个项目是否存在的最有效方法

  13. 13

    Python:对交易进行分类的最有效方法

  14. 14

    使用和与多个线程通信的最有效方法

  15. 15

    为多个ssh隧道设置最有效的方法?

  16. 16

    通过wifi进行通讯的最有效方法

  17. 17

    对文本值进行排序的最有效方法是什么?

  18. 18

    在Matlab中读取多个.JPG文件的最有效方法是什么?

  19. 19

    在ScrollPane中包装GridPane或以编程方式对其进行修改。最有效的方法?

  20. 20

    在Rails中跨表/模型进行查询的最有效方法

  21. 21

    在bash脚本中测试多个值的最有效方法是什么

  22. 22

    从Python中的类方法返回多个值的最有效方法是什么?

  23. 23

    在Bash中搜索文本文件中多个术语的最有效方法

  24. 24

    在XQuery中对多个值进行计数的最有效方法

  25. 25

    在Parse中对数据进行分组的最有效方法是什么?

  26. 26

    用空值进行聚合的最有效方法是什么?

  27. 27

    基于pandas中的两个条件进行分组和聚合的最有效方法

  28. 28

    处理多个文件的最有效方法

  29. 29

    在objective-c中对键值对进行排序的最有效方法

热门标签

归档