XQuery/标签云
外观
< XQuery
一个标签云(或视觉设计中的加权列表)是用户生成的标签的视觉描述,或者只是网站的文字内容,通常用于描述网站的内容。
创建标签云的一种方法是创建一个文档中单词的列表,统计每个单词出现的次数,并用比出现频率低的单词更大的字体大小来描绘出现频率更高的单词。
为了了解一种基本技术,让我们来研究一下 Jon Robie 的代码,该代码获取文档中的所有文本节点,将它们串联起来,将它们分成一系列“单词”(按空格、标点符号或“nbsp”实体进行标记),并统计由此产生的单词数量。
let $txt := string-join( $doc//text() , " ")
return
count(tokenize($txt,'(\s|[,.!:;]|[n][b][s][p][;])+'))
请注意,这里的 string-join() 函数接收一个输入序列,并返回一个以单个空格(string-join 的第二个参数)分隔的单个字符串。
如果您想查看此例程在您的文档中将什么视为“单词”,请使用以下变体。
let $txt := string-join( $doc//text() , " ")
let $words := tokenize($txt,'(\s|[,.!:;]|[n][b][s][p][;])+')
return
<words count="{count($words)}">
{ for $word in $words return <word>{$word}</word> }
</words>
另一个变体是 xqueryfunctions.com 上的 word-count() 函数。
declare function local:word-count( $arg as xs:string? ) as xs:integer {
count(tokenize($arg, '\W+')[. != ''])
} ;
此版本使用\W+
正则表达式(匹配非字母字符)来返回单词标记。
Kurt Cagle 建议使用以下 XQuery 来统计关键词。
declare namespace xqwb="http://xquery.wikibooks.org";
declare function xqwb:word-count($wordlist as element() ) as element() {
<terms>
{for $term in distinct-values($wordlist/term)
let $term-count := count($wordlist/term[. = $term])
return
<term count="{$term-count}">{$term}</term>
}
</terms>
};
let $keywords :=
<keywords>
<term>red</term>
<term>green</term>
<term>red</term>
<term>blue</term>
<term>violet</term>
<term>red</term>
<term>blue</term>
<term>blue</term>
<term>red</term>
<term>orange</term>
<term>green</term>
<term>yellow</term>
<term>indigo</term>
<term>red</term>
</keywords>
let $result := xqwb:word-count($keywords)
return $result
<terms>
<term count="5">red</term>
<term count="2">green</term>
<term count="3">blue</term>
<term count="1">violet</term>
<term count="1">orange</term>
<term count="1">yellow</term>
<term count="1">indigo</term>
</terms>
由此您可以创建一个标签云或文字密度图,例如 flickr 网站上的“热门标签”链接 Flicker 热门标签
declare namespace xqwb="http://xquery.wikibooks.org";
declare option exist:serialize "method=xhtml media-type=text/html indent=yes";
declare function xqwb:word-count($wordlist as element() ) as element() {
<terms>
{for $term in distinct-values($wordlist/term)
let $term-count := count($wordlist/term[. = $term])
return
<term count="{$term-count}">{$term}</term>
}
</terms>
};
let $keywords :=
<keywords>
<term>red</term>
<term>green</term>
<term>red</term>
<term>blue</term>
<term>violet</term>
<term>red</term>
<term>blue</term>
<term>blue</term>
<term>red</term>
<term>orange</term>
<term>green</term>
<term>yellow</term>
<term>indigo</term>
<term>red</term>
</keywords>
let $result := xqwb:word-count($keywords)
let $total := count($keywords/term)
let $scale := 20
return
<div>
{
for $term in $result/term
let $fontSize := round( $term/@count div $total * 100 * $scale)
order by $term
return <span style="font-size:{$fontSize}%">{string($term)} </span>
}
</div>