2015-01-12 63 views
0

我想通过Apriori算法从XML文档中挖掘关联规则。这样做有两种常用方法:1)将XML映射到关系格式并应用经典的Apriori,2)直接挖掘XML。我想使用后者,但有几个问题。Apriori算法挖掘XML文档

研究后,我发现两个不完整的解决方案:

post在SO提供用于产生k项集

paper在于提出了通过XQuery的一个模拟的Apriori的溶液(所提供的代码是不完整)

请让我知道你的想法和建议,我该如何做到这一点(两种方法)?

更新:

根据所提到的文件的另一个版本,该数据集是这样的:

<transactions> 
<transaction id="1"> 
<items> 
<item>a</item> 
<item>d</item> 
<item>e</item> 
</items> 
</transaction> 

<transaction id="2"> 
<items> 
<item>b</item> 
<item>c</item> 
<item>d</item> 
</items> 
</transaction> 

<transaction id="3"> 
<items> 
<item>a</item> 
<item>c</item> 
</items> 
</transaction> 

<transaction id="4"> 
<items> 
<item>b</item> 
<item>c</item> 
<item>d</item> 
</items> 
</transaction> 

<transaction id="5"> 
<items> 
<item>a</item> 
<item>b</item> 
</items> 
</transaction> 

</transactions> 

然后,功能如下

define function join(element $X, element $Y) returns element { 
let $items := (for $item in $Y 
where every $i in $X satisfies 
$i != $item 
return $item) 
return $X union $items 
} 

define function commonIts(element $X, element $Y) returns 
element { 
for $item in $X 
where some $i in $Y satisfies $i = $item 
return $item 
} 

define function removeIts(element $X, element $Y) returns 
element { 
for $item in $X 
where every $i in $Y satisfies $i != $item 
return $item 
} 

define function candidateGen(element $l) returns element { 
for $freqSet1 in $l 
let $items1 := $freqSet1//items/* 
for $freqSet2 in $l 
let $items2 := $freqSet2//items/* 
where $freqSet2 >> $freqSet1 and 
count($items1)+1 = count($items1 union $items2) 
and prune(join($items1,$items2), $l) 
return <items> 
{join($items1,$items2)} 
</items> 
} 

define function prune(element $X, element $Y) returns boolean 
{ 
every $item in $X satisfies 
some $items in $Y//items satisfies 
count(commonIts(removeIts($X,$item),$items/*)) 
= count($X) - 1 
} 

define function removeDuplicate(element $C) returns element 
{ 
for $itemset1 in $C 
let $items1 := $itemset1/* 
let $items :=(for $itemset2 in $C 
let $items2 := $itemset2/* 
where $itemset2>>$itemset1 and 
count($items1) = 
count(commonIts($items1, $items2)) 
return $items2) 
where count($items) = 0 
return $itemset1 
} 

define function getLargeItemsets(element $C, element $minsup, 
element $total, element $src) returns element { 
for $items in $C 
let $trans := (for $tran in $src 
where every $item1 in $items/* satisfies 
some $item2 in $tran/* 
satisfies $item1 = $item2 
return $tran) 
let $sup := (count($trans) * 1.00) div $total 
where $sup >= $minsup 
return <largeItemset> {$items} 
<support> {$sup} </support> 
</largeItemset> 
} 

define function apriori(element $l, element $L, element $minsup, 
element $total, element $src) returns element { 
let $C := removeDuplicate(candidateGen($l)) 
let $l := getLargeItemsets($C, $minsup, $total, $src) 
let $L := $l union $L 
return if (empty($l)) then 
$L 
else 
apriori($l, $L, $minsup, $total, $src) 
} 

let $src := document(“/transactions.xml”)//items 
let $minsup := 0.4 
let $items := (for $item in $src/* 
where $itemset = $item 
let $total := count($src) * 1.00 
let $C := distinct-values($src/*) 
let $l :=(for $itemset in $C 
return $item) 
let $sup := (count($items) * 1.00) div $total 
where $sup >= $minsup 
return <largeItemset> 
<items> {$itemset} </items> 
<support> {$sup} </support> 
</largeItemset>) 
let $L := $l 
return <largeItemsets> { apriori($l, $L,$minsup, $total, $src) } 
</largeItemsets> 

并计算规则文件,他们引入了这个表达式:

let $minconf := 1.00 
let $src := document(“/large.xml”)//largeItemset 
for $itemset1 in $src 
let $items1 := $itemset1/items/* 
for $itemset2 in $src 
let $items2 := $itemset2/items/* 
where count($items1) > count($items2) and 
count(commonIts($items1, $items2)) = 
count($items2) and $itemset1/support div 
$itemset2/support >= $minconf 
return <rule support =“{$itemset1/support}” 
confidence = “{($itemset1/support*1.0) div 
($itemset2/support*1.0)}”> 
<antecedent> {$items2} </antecedent> 
<consequent> 
{removeItems($items1,$items2)} 
</consequent> 
</rule> 

现在,我面临的最大挑战是将这些功能集成在一起工作。

+0

不幸的是,你的问题不适合SO,因为它主要要求完整的代码来解决某些算法问题。我建议你自己尝试使用XQuery来编写这种算法,如果你没有“将这些功能集成在一起”,你就回过头来问自己,正如你自己所说的那样。 – dirkk

+0

我正在研究,但是由于我是XQuery中的新成员,因此找到函数的不同部分和详细信息时有点困惑和复杂。 – Eilia

回答

0

第一种方法会快很多。将数据仅预处理一次(处理XML代价很高),转换成非常适合您算法的输入格式!

关于查找源代码的问题在这里是焦点话题。尝试解决这个问题,回过头来提一些涉及您编写的代码的特定问题,并尝试以简洁的格式展示它们,以便以自包含的QA样式很好地回答问题。

另请注意,上述尝试使用Xquery实现Apriori时缺少一些构成Apriori算法贡献的必要的必要的优化。对于一个真正可用的Apriori实现,您需要使用优化的数据结构,您不能在XQuery中实现此目的。尝试在一些经典数据集上运行此实现,并且它将只是死亡。使用Apriori进行扩展已经足够困难,但使用XQuery来实现它却是疯狂之路 - 一个关键的挑战就是保持内存使用率低,即使在C中!

+0

你的答案似乎主要是一个评论,而不是一个实际的答案。只有你的前两个句子才能回答这个问题,而这本身就不足以获得高质量的答案。简单地说一种方法快得多并不是很有用 - 为什么它更快? – dirkk

+0

另外,你的答案是第一种方法会更快,但这是不正确的。例如,你也可以实现先验算法。 XQuery并使用XML作为数据源。 – dirkk

+1

重复处理XML *代价高昂。你只想做一次。这就是为什么它更快。你似乎主张XQuery,但是你有没有实现过APRIORI? (也请注意,在我的答案后编辑了该问题...) –