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>