LoginSignup
1
3

More than 3 years have passed since last update.

コーパスとしての法律文書(条文データ)の取得

Last updated at Posted at 2021-03-27

はじめに

法律文書を集めようとすると、初めに考えうるのはeGovの条文と思われる。
条文データはXMLで公開されており、構造化されているためである。
他方、例えば裁判所の判例データは、PDFで公開されており、テキスト化すると少々崩れる(大きくは崩れなかった)。

筆者にとっての一番の問題は「XMLとは何ぞ?」な状態なことである。
ここでは、eGovデータを活用するにあたって、調べたXMLの使い方を記載する。

XMLとは

2000年頃、JSONが流行る前に使われていたデータを表現する技術。仕様が巨大すぎてよくわらからぬ。が、プログラム(クラス)も生成することができる模様。
パーサは機能が多くなりがちであり、それゆえ脆弱性を産みやすい。今も生き延びている亜流にHTMLがある。

やったこと

やらないといけないことは、
1. XSD(xml schema definition:XMLのスキーマ定義)からクラスを生成する
2. XMLデータを読み込み、オブジェクト(インスタンス)を生成する
の二つである。

XSDは以下から取れる。
https://elaws.e-gov.go.jp/help/

ちなみにXML(データ自体)は以下から取れる。
https://elaws.e-gov.go.jp/download/

1. XSDからクラスの生成

Java 8のJDK付属xjcを用いる。Java 9以降では付いていないらしい。

$> xjc XMLSchemaForJapaneseLaw_v3.xsd

トラブルシューティング(というか応急処置)

なんかエラーが出たので、とりあえずメモっとく。

$> xjc XMLSchemaForJapaneseLaw_v3.xsd
スキーマの解析中...
スキーマのコンパイル中...
[ERROR] 同じ名前"generated.Sublist3Sentence"のクラス/インタフェースがすでに使用されています。この競合を解決するには、ク ラス・カスタマイズを使用してください。
行1761
[ERROR] (前述のエラーに関連して)別の"Sublist3Sentence"がここから生成されます。
行1766
[ERROR] 2つの宣言により、ObjectFactoryクラスで衝突が発生しました。
行1761
[ERROR] (前述のエラーに関連して)これは他方の宣言です。
行1766
コードの生成に失敗しました。

なんか競合したので該当行において以下の処置を実施した(正直わかっていません)。

 <xs:element name="Sublist3" type="Sublist3Sentence"/>
  <xs:complexType name="Sublist3Sentence">
    <xs:sequence>
      <!--xs:element ref="Sublist3Sentence"/-->  ★この辺(コメントアウト)
      <xs:element ref="Sublist3SentenceE"/>★この辺(追記)
    </xs:sequence>
  </xs:complexType>
  <!--xs:element name="Sublist3Sentence"-->  ★この辺(コメントアウト)
  <xs:element name="Sublist3SentenceE">★この辺(追記)
    <xs:complexType>
      <xs:choice>
        <xs:element maxOccurs="unbounded" ref="Sentence"/>
        <xs:element maxOccurs="unbounded" ref="Column"/>
      </xs:choice>
    </xs:complexType>
  </xs:element>

2. XMLデータを読み込み、オブジェクトを生成する

読み込めば、自由に編集できる。
読み込むだけなら以下でできるが、構造を考えてのプログラミングは複雑なコードになっていく。別記事で記載する予定。

File file = new File(fileName + ".xml");
JAXBContext context = JAXBContext.newInstance(Law.class);
Unmarshaller unmarshaller = context.createUnmarshaller();
Law law = (Law)unmarshaller.unmarshal(file);

付録

生成されたクラスはGitHubに置いています。

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3