在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

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

Related 相关文章

  1. 1

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

  2. 2

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

  3. 3

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

  4. 4

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

  5. 5

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

  6. 6

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

  7. 7

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

  8. 8

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

  9. 9

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

  10. 10

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

  11. 11

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

  12. 12

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

  13. 13

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

  14. 14

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

  15. 15

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

  16. 16

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

  17. 17

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

  18. 18

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

  19. 19

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

  20. 20

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

  21. 21

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

  22. 22

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

  23. 23

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

  24. 24

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

  25. 25

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

  26. 26

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

  27. 27

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

  28. 28

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

  29. 29

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

热门标签

归档