XSLTを使ってXMLデータからオープン拡張辞書形式に変換する方法(2)

前回は、オープン拡張辞書の説明と、辞書情報に関する説明を行いました。ここらはXSLを使ってオープン拡張辞書を作成したいと思います。

XSLファイルを作成する

Wikipedia Dictionaryのデータを定義したので、WikipediaXMLファイルからオープン拡張辞書フォーマットへXSLTを使って変換したいと思います。これからの説明は、Windows7上で作業を行うことを想定します。また、作成したXSLTMSXMLの独自機能を一部使っています。

XSLTとは何かというと、XMLデータからXMLCSVなどといった形式に変換する仕組みです。どのようなルールで変換するかをXSL(Extensible Stylesheet Language)で記述します。Wikipediaに詳しいことが書いてありますので興味ある方はご覧ください。ある程度XSLTについて知識があるという前提で説明を続けます。http://ja.wikipedia.org/wiki/XSLT

まずはXSLで変換ルールを作成する前に、どのような単語データを出力する必要があるかを先に見ていきたいと思います。単語データは以下の2つは必ず必要になります。

  1. 登録したい単語

    • 例:オープン拡張辞書

  2. その単語のよみ
    • 例:おーぷんかくちょうじしょ

登録したい単語とその読みについてはWikipediaのデータから取り出します。品詞とコストについて今回は決め打ちで、品詞は「名詞」、コストは「200」とします。上記の例をオープン拡張辞書フォーマットに変換すると次のようになります。

[sourcecode language="xml"]

<ns1:DictionaryEntry>

<ns1:InputString>おーぷんかくちょうじしょ</ns1:InputString> よみ(ひらがな)

<ns1:OutputString>オープン拡張辞書</ns1:OutputString> 単語

<ns1:PartOfSpeech>Noun</ns1:PartOfSpeech> “Noun”は名詞

<ns1:CommentData1>…</ns1:CommentData1> コメント

<ns1:URL>…</ns1:URL> リンク

<ns1:Priority>200</ns1:Priority> コスト

<ns1:ReverseConversion>true</ns1:ReverseConversion> 逆変換に使うか?

<ns1:CommonWord>false</ns1:CommonWord> 第一候補になるか?

</ns1:DictionaryEntry>

[/sourcecode]

オープン拡張辞書では4つのデータ以外に、単語に対してコメントをつけることも可能です。せっかくなので、Wikipediaのデータを活用してコメントもつけてみたいと思います。

変換するためには、変換前のXML形式を当然知っておく必要があるので、Jawiki-latest-abstract.xmlスキーマを説明します。

実例を見たほうが早そうなので、サンプルの形式を作ってみました(実際にWikipediaにあるデータではなく、例として作りました)。

[sourcecode language="html"]

<doc>

</doc>

<doc>

<title>Wikipedia: オープン拡張辞書</title>

<url>http://ja.wikipedia.org/...</url>

<abstract>オープン拡張辞書(おーぷんかくちょうじしょ)は、・・・</abstract>

<links>

….

</links>

</doc>

</feed>

[/sourcecode]

<feed>タグが一番トップになり、その中に<doc>タグが複数入ります。この<doc>タグがWikipediaの1ページのデータに相当します。<doc>タグの下にさらに以下のタグを持ちます。

  • <title>

    • ページタイトル

  • <url>

    • ページのURL

  • <abstract>

    • 概要

  • <links>

    • リンク情報

さて、ざっとWikipediaXMLファイルの構造を理解したので、このデータから辞書エントリを生成します。登録単語、単語のよみ、リンク以外は決め打ちにするとすでに決めましたので、残っている3つをXSLの中で取り出して、オープン拡張辞書形式に変換したいと思います。

登録単語

登録単語はページタイトル(titleタグ)から取り出します。必ず”Wikipedia: “という文字がページタイトルの前につくので、取り除く必要があります。

<title>Wikipedia: オープン拡張辞書</title>

単語のよみ

日本語のWikipediaの各ページは、概要の中に単語のよみを入れる習慣があるようです(すべてではないですが)。赤字の部分がよみになります。先頭に単語がきて、そのあとにかっこ内によみが入ります。

<abstract>オープン拡張辞書(おーぷんかくちょうじしょ)は、・・・</abstract>

リンク

リンクはurlタグのURLをそのまま使います。

以上で、登録単語、単語の読み、リンクの3つのデータを取り出す方法がわかりましたので、実際にXSLのコードに落とし込みます。ソースコード(wiki2oed.xsl)をこちらに置きましたので、お手元で開いてください。

XSLファイルは大きく分けると3つのブロックからなります。

1. よみを取り出したりするC#のコード(MSXML独自の機能)

かっこの中からよみを取り出します。かっこの中はカタカナや句読点が混じっていたりしているので、少し複雑な正規表現を書いていますが、よみをとる処理をしています。

2. 静的な辞書情報を埋め込んでいる処理(<xsl:templatematch="/feed">…</xsl:template> )

基本的には単純にタグを埋め込んでいるだけですが、最後の赤字の部分が、次に説明する単語生成処理を呼び出すために書いておく必要があります。

</ns1:DictionaryHeader>

<xsl:apply-templates select="doc"/>

</ns1:Dictionary>

3. 単語データを解析し、DictionaryEntryタグに変換している処理(<xsl:templatematch="doc">…</xsl:template>)

Wikipediaの各docタグを処理する部分です。1.で作成したC#のコードを呼び出して、登録単語、よみを抽出します。

              <xsl:variablename="title"select="user:RemoveParenthesis(substring-after(title, 'Wikipedia: '))" />

              <xsl:variablename="reading"select="translate(user:KatakanaToHiragana(user:GetReadingFromAbstract(abstract)), ' ', '')" />

コメントについてはそのまま取り出したデータを埋め込んで上げます。xsl:value-ofというのが、指定したタグからデータを取り出す操作になります。

                                            <ns1:CommentData1><xsl:value-ofselect="abstract" /></ns1:CommentData1>

                                            <ns1:URL><xsl:value-ofselect="url" /></ns1:URL>

これでXSLファイルの完成です。Wiki2oed.xslというファイル名でUTF-8で保存してください。

さて、次回で最後です。実際に辞書を生成したいと思います。

XSLTを使ってXMLデータからオープン拡張辞書形式に変換する方法(3)