草庐IT

xml - 从 xml 文档中查找 1-itemset, 2-itemset...n-itemset

coder 2024-06-26 原文

<?xml version="1.0" encoding="utf-8"?>
<transaction>
    <itemset id="1">
        <item>pen</item>
        <item>notebook</item>
        <item>pencile box</item>
    </itemset>
<itemset id="2">
    <item>pen</item>
    <item>notebook</item>
    <item>pencile box</item>
    <item>ink</item>
</itemset>
<itemset id="3">
    <item>ink</item>
    <item>milk</item>
</itemset>
<itemset id="4">
    <item>pen</item>
    <item>notebook</item>
    <item>pencile box</item>
    <item>ink</item>
    <item>milk</item>
    <item>paper</item>
</itemset>
<itemset id="5">
    <item>pen</item>
    <item>ink</item>
    <item>notebook</item>
</itemset>
</transaction>

我是 XQuery 的新手。我正在使用 BaseX 来运行 XQuery。我的目标是根据非常流行的 Apriori 算法从每笔交易中找到 1-频繁 2-频繁项目集... n-频繁项目集并计算它们。

我已经找到了 1-frequent 项集及其支持度。但是我无法使用 XQuery 找到 2 项集及其支持计数。谁能帮我做到这一点? 这是我试过的代码...

let $src:= doc('XML/test.xml')/transaction/itemset
let $minsup:= 3
let $C:=distinct-values($src/*)
let $l:=for $itemset in $C
        let $items:=(for $item in $src/*
                     where $itemset=$item
                     return $item)
                     let $sup := count($items)
        where $sup>=$minsup
        order by $sup descending
return<itemset>
      <item> {$itemset} </item>
      <support> {$sup} </support>
      </itemset>

let $C1:=distinct-values($l/item)
let $C2:=distinct-values($l/item)
let $cnt:=count(distinct-values($l/item))
let $counter:=0
for $a in $C1
    for $b in $C2
    where $a>$b
return <items>
       <item>{concat($a,',',$b)}</item>
       </items>

预期的输出看起来像

<itemset>
  <item>pen</item>
  <support>4</support>
</itemset>
<itemset>
  <item>notebook</item>
  <support>4</support>
</itemset>
...............
<itemset>
  <item>pen</item>
  <item>notebook</item>
  <support>4</support>
</itemset>
<itemset>
  <item>pen</item>
  <item>pencile box</item>
  <support>3</support>
</itemset>
................
<itemset>
  <item>pen</item>
  <item>notebook</item>
  <item>pencile box</item>
  <support>3</support>
</itemset>
<itemset>
  <item>pen</item>
  <item>notebook</item>
  <item>ink</item>
  <support>3</support>
</itemset>
...............

最佳答案

目前还不完全清楚您要做什么。我在这里所说的是基于这样的信念,即您想要的是一个频率列表,首先是单个项目值,然后是项目对,然后是三元组,然后是 n > 3 的 n 元组。或者,更抽象地说:对于 $n = 1到输入中不同项目值的数量,从出现超过 $minsup 次的不同项目值集中找到 $n 个不同值的每个选择。

(如果这不是对问题的正确描述,那么从现在开始我所说的一切都将是相关的。如果它是正确的描述,那么我祝贺你:这是一个很好的问题。感觉有点像旨在迫使您考虑元编程或递归的家庭作业;如果是这样,我认为提及这一事实是一种很好的形式。)

您在这里面临不止一项挑战。如果这是我的问题,我将从 $n = 1 的情况开始。您的代码的第一部分正确计算 $n = 1 的结果,作为 $l 的值,所以您已经在那里了。

然后我会为 $n = 2、$n = 3 等手动编写代码,直到我觉得我已经理解了该模式为止。 (实际上,我在 n = 4 之后停止。比我更早停止的程序员更聪明。)您具体询问 $n = 2 的情况。以下代码在某些方面与您的类似,但在细节上有所不同。我重命名了一些变量,以便于阅读。

let $src:= doc('.../utij.xml')/transaction
let $minsup:= 3
let $allitems := $src/itemset/item
let $C:=distinct-values($allitems)

let $n1 := for $value in $C
           let $itemsets := $src/itemset[item = $value]
           let $sup := count($itemsets)
           where $sup>=$minsup
           order by $sup descending
           return <itemset>
                    <item> {$value} </item>
                    <support> {$sup} </support>
                  </itemset>

let $n2 := for $v1 in $C, $v2 in $C
           let $itemsets := $src/itemset
                            [ item = $v1 
                              and item = $v2 
                              and $v1 gt $v2
                            ]
           let $sup := count($itemsets)
           where $sup ge $minsup
           order by $sup descending, $v1 ascending, $v2 ascending
           return <itemset>
                    <item>{$v1}</item>
                    <item>{$v2}</item>
                    <support>{$sup}</support>
                  </itemset>

return ($n1, '&#xA;........&#xA;', $n2)

请注意,我重新转换了 $n=1 的情况以计算包含具有适当值的项目的项目集元素,而不是项目元素本身。这使得两个代码块更加相似,并且应该使 $n 大于 2 的扩展显而易见。

然后我会停下来考虑我的 $n = 1, 2, 3, ... 的代码是否可以泛化。因为(正如您的草图已经反射(reflect)的那样)编写代码的直接方法涉及一个变量,范围涵盖 $n = 1 的所有值,两个变量 $n = 2,i 个变量 $n = i,答案是:这将很难以天真的方式概括。所以我会考虑一个接受两个输入的函数:第一个是项目集元素序列(在我的示例中是 $src 变量),第二个是 n 元组序列。作为输出,我的函数将返回一个 n+1 元组序列。 (此时,我将为 $C 添加第三个参数,以避免每次都重新计算它。)可以设置第二个函数来为 1 和不同项目值的数量之间的每个值调用第一个函数在输入中,并返回结果的串联。

关于xml - 从 xml 文档中查找 1-itemset, 2-itemset...n-itemset,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19917638/

有关xml - 从 xml 文档中查找 1-itemset, 2-itemset...n-itemset的更多相关文章

  1. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  2. ruby - 当使用::指定模块时,为什么 Ruby 不在更高范围内查找类? - 2

    我刚刚被困在这个问题上一段时间了。以这个基地为例:moduleTopclassTestendmoduleFooendend稍后,我可以通过这样做在Foo中定义扩展Test的类:moduleTopmoduleFooclassSomeTest但是,如果我尝试通过使用::指定模块来最小化缩进:moduleTop::FooclassFailure这失败了:NameError:uninitializedconstantTop::Foo::Test这是一个错误,还是仅仅是Ruby解析变量名的方式的逻辑结果? 最佳答案 Isthisabug,or

  3. ruby - 查找字符串中的内容类型(数字、日期、时间、字符串等) - 2

    我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s

  4. Matlab imread()读到了什么 (浅显 当复习文档了) - 2

    matlab打开matlab,用最简单的imread方法读取一个图像clcclearimg_h=imread('hua.jpg');返回一个数组(矩阵),往往是a*b*cunit8类型解释一下这个三维数组的意思,行数、数和层数,unit8:指数据类型,无符号八位整形,可理解为0~2^8的数三个层数分别代表RGB三个通道图像rgb最常用的是24-位实现方法,即RGB每个通道有256色阶(2^8)。基于这样的24-位RGB模型的色彩空间可以表现256×256×256≈1670万色当imshow传入了一个二维数组,它将以灰度方式绘制;可以把图像拆分为rgb三层,可以以灰度的方式观察它figure(1

  5. ruby-on-rails - 在 Rails 中更高效地查找或创建多条记录 - 2

    我有一个应用需要发送用户事件邀请。当用户邀请friend(用户)参加事件时,如果尚不存在将用户连接到该事件的新记录,则会创建该记录。我的模型由用户、事件和events_user组成。classEventdefinvite(user_id,*args)user_id.eachdo|u|e=EventsUser.find_or_create_by_event_id_and_user_id(self.id,u)e.save!endendend用法Event.first.invite([1,2,3])我不认为以上是完成我的任务的最有效方法。我设想了一种方法,例如Model.find_or_cr

  6. ruby - 查找重叠的正则表达式匹配项 - 2

    我想找到给定字符串中的所有匹配项,包括重叠匹配项。我怎样才能实现它?#Example"a-b-c-d".???(/\w-\w/)#=>["a-b","b-c","c-d"]expected#Solutionwithoutoverlappedresults"a-b-c-d".scan(/\w-\w/)#=>["a-b","c-d"],but"b-c"ismissing 最佳答案 在积极的前瞻中使用捕获:"a-b-c-d".scan(/(?=(\w-\w))/).flatten#=>["a-b","b-c","c-d"]参见Rubyde

  7. Ruby 等同于 Sphinx 文档生成器? - 2

    Ruby有一些不错的文档生成器,例如Yard、rDoc,甚至Glyph。问题是Sphinx可以做网站、PDF、epub、LaTex等。它在重组文本中完成所有这些事情。在Ruby世界中有替​​代方案吗?也许是程序的组合?如果我也能使用Markdown就更好了。 最佳答案 自1.0版以来,Sphinx有了“域”的概念,它是从Python和/或C以外的语言标记代码实体(如方法调用、对象、函数等)的方法。有一个rubydomain,所以你可以只使用Sphinx本身。您唯一会缺少的(我认为)是Sphinx使用autodoc从源代码自动创建文档

  8. ruby - 在 Ruby 中查找多个正则表达式匹配的模式和位置 - 2

    这应该是一个简单的问题,但我找不到任何相关信息。给定一个Ruby中的正则表达式,对于每个匹配项,我需要检索匹配的模式$1、$2,但我还需要匹配位置。我知道=~运算符为我提供了第一个匹配项的位置,而string.scan(/regex/)为我提供了所有匹配模式。如果可能,我需要在同一步骤中获得两个结果。 最佳答案 MatchDatastring.scan(regex)do$1#Patternatfirstposition$2#Patternatsecondposition$~.offset(1)#Startingandendingpo

  9. ruby-on-rails - 在 irb 中阅读文档 - 2

    我怀念ipython的一件事是它有一个?为特定功能挖掘文档的运算符。我知道ruby​​有一个类似的命令行工具,但是我在irb中调用它非常不方便。ruby/irb有类似的东西吗? 最佳答案 Pry是IPython的Ruby版本,它支持?命令来查找有关方法的文档,但语法略有不同:pry(main)>?File.dirnameFrom:file.cinRubyCore(CMethod):Numberoflines:6visibility:publicsignature:dirname()Returnsallcomponentsofthef

  10. ruby-on-rails - 如何在 Rails 3 中禁用 XML 解析 - 2

    我想禁用HTTP参数的自动XML解析。但我发现命令仅适用于Rails2.x,它们都不适用于3.0:config.action_controller.param_parsers.deleteMime::XML(application.rb)ActionController::Base.param_parsers.deleteMime::XMLRails3.0中的等价物是什么? 最佳答案 根据CVE-2013-0156的最新安全公告你可以将它用于Rails3.0。3.1和3.2ActionDispatch::ParamsParser::

随机推荐