1

テロ事件の120MBのXMLデータベース(ここからダウンロードできる最初のファイルhttp://wits.nctc.gov/Export.do)をスプレッドシート形式に変換して、他のデータとマージして統計分析を行えるようにしようとしています。

これまで私はStataを使用してきましたが、XMLを読み取れないため、今は役に立ちません。このサイトでは月ごとに小さいファイルを提供しており、Excelで開くことができますが、Excelでは希望の形式で表示されないため、100を超える単一のファイルを開いて手動で保存するよりも、ファイル全体を変換する方がよいでしょう。タブを分離してからマージします。

完全なWITS.xmlファイルをスプレッドシートに変換する方法を探しています。このスプレッドシートでは、1つの行が単一のテロ事件を表しており、xmlからの情報が欠落していないはずです。構造が異なるXMLでもおそらく問題ありません。コンバーターを試しましたが、無料ではないか、希望どおりに動作しないか、ファイルサイズが大きすぎるため、xsltの使用方法がわかりません。私は経済学を勉強していますが、プログラミングの知識は事実上存在せず、ますます欠点になっています。私が使用できるRのパッケージがあることを確認しました。おそらく今が、Rまたは他の言語の学習を開始する適切なタイミングです。しかし、それを行うための迅速で簡単な方法があれば、私はそれを好むでしょう。

4

2 に答える 2

5

一般に、XMLファイルを処理するための特定のRパッケージやスニペットよりも、XMLの概念についてより多くの支援が必要なようです(ただし、これは後で来る可能性があります;-))。また、 R、Stata、またはその他の統計ツールで使用する前に、入力ファイルをより適切な形式に変換することをお勧めします。

<incident>説明のために、質問で言及されたソースからの最初のレコードを以下に複製しています。他のインシデントも同様の構造になると想定できます。DTDファイルを調べることで、ルートに他のノード(「レコード」)が含まれているかどうか、<incidents>およびこれらのインシデントがまったく同じ構造を持っているかどうか(または、たとえば、一部のインシデントタイプに余分な<LocalWeatherConditions>ノードなどがある場合)をアサートできます。たとえば、<facilityList>ノードがオプションの場合)。この議論の目的のために、すべてのインシデントレコードが同じ一般的な構造を持っていると仮定することはOKです。

「 1つの行が単一のテロ事件を表し、xmlからの情報が欠落していないはずのスプレッドシート」という要求は、カーディナリティの問題のために達成するのが難しい場合があります。これは、インシデントレコードの一部のサブ要素が繰り返される可能性があることを示すための空想的な方法です。たとえば、名前が「リスト」で終わるノードのほとんどには、通常、複数のサブレコードを含めることができます(ところで、この「名前のリスト」はXMLルールではなく、この特定のデータベースの管理者が使用している規則にすぎません)。 。たとえば、<CityStateProvince>CityとStateProvinceの値がそれぞれ独自の値を持つ複数のレコードが存在する場合や、値の長いリストを持つ複数の`レコードが存在する可能性があります。
データを1行に「フラット化」することができます。一般的なプロセスは「非正規化」の1つであり、単一の行に番号付きのラベルが付いた列が含まれます。

  ..., City1, StateProv1, City2, StateProv2, City3, StateProv3 ... (btw where do we stop?)

さらに、基礎となる言語の(絶対的または実用的な)制限を超える可能性のある幅広いレコードにつながることを除けば、この形式は、統計全体の集約と実行に関して非常に厄介です:StateProvでカウントを取得したい場合:今必要ですこの情報が見つかる可能性のあるすべての場所を「調べる」ようにプログラムに指示します: "StateProv1"、 "StateProv2" .. ..

統計処理により適した代替形式は、複数の「スプレッドシート」にエクスポートすることです。これにより、メインスプレッドシートには、インシデントレコードのすべての再現不可能なプロパティについて、インシデントごとに1行が含まれ、追加のスプレッドシートには、繰り返される可能性のある「サブレコード」が含まれます。これらのサブレコードには、メインスプレッドシート(​​ここではおそらくICN)の基になるレコードに関連付けるために使用できる「キー」が含まれている必要があります。また、たとえばIncidateDateを取り込むなど、メインスプレッドシートから重複した情報が含まれる場合もあります。 、暗殺フラグなど。[別の種類の]この非正規化の目的は、これらの追加のスプレッドシートを、対象となる分析の一部に対して自給自足にすることです。

そこからどこへ行くの?

  • XML入力から生成されるspeadsheetの正確な形式を定義する必要があります。
    番号付きラベルのアプローチは実用的ではないという事実に同意する可能性が高いため、入力データを確認し、それをどのように分割するかを確認する必要があります(ここでもデータを複製する機能があります)。
  • たとえば、このXMLパッケージのRを使用して、入力をR変数(テーブル、リスト、ベクトルなど)に解析できます。
  • または、外部プログラムを使用して、XML入力を表形式(CSV形式など)にエクスポートすることもできます。これは、Rによってより簡単に取り込まれます。
    前述のXMLパッケージを使用していますが、小さなファイル(および主に出力目的)の場合、非効率的でバグが発生しやすく(テキストファイルで実行できるように、効果的な入力を簡単に検査する機能がない)、一般的に不器用である可能性があります。

幸いなことに、この変換/インポートジョブをすぐに乗り越えて、手元の統計に集中することができます!

いくつかの最後の指針:

  • DTD言語を簡単に理解できない場合でも、XTDファイル、特にファイル<xs:enumeration ...>の大部分を構成する多くのリストを確認してください。これらは係数(R用語)の値を提供します。もちろん、Rはデータからこれらも推測できますが、相互参照の目的で列挙からの情報を使用できます(データが事前に適切にロードされたことを確認するためなど)。

  • おそらく、いくつかのレコードサンプルからスキーマを推測することは問題ありません(XMLに慣れていない人は、XSDファイルよりもXMLデータを簡単に理解できます)。ただし、確実にXSDファイルを読み取る必要があります。


<IncidentList xmlns="http://wits.nctc.gov" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://wits.nctc.gov WITS.XSD">

<Incident>
   <ICN>200458431</ICN>
   <Subject>10 civilians killed, at least 45 wounded by suspected GAM in Peureulak, Indonesia</Subject>
   <Summary>On 1 January 2004, in Peureulak, Aceh Province, Indonesia, a bomb exploded at a concert, killing ten civilians, wounding 45 others, and causing major damage to the stage area.  Many of the victims were Indonesian teenagers.  Police blamed the Free Aceh Movement (GAM), although the GAM denied responsibility.  No other group claimed responsibility.</Summary>
   <IncidentDate>01/01/2004</IncidentDate>
   <ApproximateDate>No</ApproximateDate>
   <MultipleDays>No</MultipleDays>
   <EventTypeList>
      <EventType>Bombing</EventType>
   </EventTypeList>
   <Assassination>No</Assassination>
   <Suicide>No</Suicide>
   <WeaponTypeList>
       <WeaponType>Explosive</WeaponType>
   </WeaponTypeList>
   <IED>No</IED>
   <Location>
      <Region>East Asia-Pacific</Region>
      <Country>Indonesia</Country>
      <CityStateProvinceList>
         <CityStateProvince>
            <City>Peureulak</City>
            <StateProvince>Aceh</StateProvince>
         </CityStateProvince>
      </CityStateProvinceList>
   </Location>
   <VictimList>
      <Victim>
      <VictimType>Civilian</VictimType>
      <Combatant>No</Combatant>
      <Nationality>Indonesia</Nationality>
      <DefiningCharacteristicList>
         <DefiningCharacteristic>None</DefiningCharacteristic>
      </DefiningCharacteristicList>
      <TargetedCharacteristicList>
         <TargetedCharacteristic>Unknown</TargetedCharacteristic>
      </TargetedCharacteristicList>
      <Indicator>Targeted</Indicator>
      <Child>No</Child>
      <DeadCount>10</DeadCount>
      <WoundedCount>45</WoundedCount>
      <HostageCount>0</HostageCount>
      </Victim>
   </VictimList>
   <FacilityList>
      <Facility>
         <FacilityType>Public Place/Retail</FacilityType>
         <Combatant>No</Combatant>
         <Nationality>Indonesia</Nationality>
         <DefiningCharacteristicList>
         <DefiningCharacteristic>None</DefiningCharacteristic>
         </DefiningCharacteristicList>
         <TargetedCharacteristicList>
         <TargetedCharacteristic>Unknown</TargetedCharacteristic>
         </TargetedCharacteristicList>
         <Indicator>Targeted</Indicator>
         <Damage>Light</Damage>
         <Quantity>1</Quantity>
      </Facility>
   </FacilityList>
   <PerpetratorList>
      <Perpetrator>
         <Nationality>Indonesia</Nationality>
         <Characteristic>Secular/Political/Anarchist</Characteristic>
      </Perpetrator>
   </PerpetratorList>
</Incident>
[...]
</IncidentList>
于 2010-03-30T15:47:49.267 に答える
1

Talend Open Studioと呼ばれるオープンソース製品を使用して、この種の抽出/変換/ロードタスクを実行し始めました。これは、ポータブルPerlまたはJavaに出力するGUIベースのコード生成ツールであり、データベースおよびファイルタイプへの膨大な数の接続が付属しています。

学習曲線が必要になります。より複雑なタスクのいくつかを実行することは完全に直感的ではありません。ただし、XMLを読み取ってXLSに出力するように構成するのは、かなり高速で簡単だと思います。

于 2010-03-30T14:02:59.213 に答える