コーパスのXML解析
Last-modified: 2012-06-09 (土) 01:59:20
Top / コーパスのXML解析
コーパス付属のXMLファイルをXSLTで解析する †
日本語話し言葉コーパス(CSJ) †
XMLファイルのパスを取得する †
お題:イントネーション境界以外の母音のリストを取得する †
- 参考
- 『日本語話し言葉コーパス』のイントネーションラベリング によれば、X-JToBI の BI(break index) = 3 がイントネーション境界。
- 菊池先生からいただいたご指摘
BIには、3以外にも、2, 2+p, 2+b, 2+bpなどがあります。 「イントネーション境界」が何を指すのかにもよりますが、2がつくBIも、ある種のイントネーション境界を指します。2と3の違いは、境界の大きさです。3の方がより大きな境界、という位置づけです。概ね、2はダウンステップが継続、3はダウンステップが中止しているという状況です。分析の際には注意して下さい。 #2をイントネーション境界とすることによって結果が変わってくる可能性があります。
- 菊池先生からいただいたご指摘
- 『日本語話し言葉コーパス』XML文書についてによれば、イントネーションに関する XML の要素は <XJToBILabelBreak> である。
- したがって、<XJToBILabelBreak>要素の値が「3」以外で、かつ <Phone>要素のPhoneClass属性の値が「vowel」のときの、<Phone>要素のPhoneEntity属性の値を出力すればよい。
- XSLTテンプレートの作成
- CSJのXMLの構造
- CSJのXML要素一覧
- 階層構造は以下のとおり。
<talk> <IPU> <LUW> <SUW> <TransSUW> <Mora> <Phoneme> <Phone> <XJToBILabelBreak>
- 例:R00M0036_short.xml
- CSJのXMLの構造
- お題を実現するには、以下のようなスタイルシート*1を作成します。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xml:lang="ja"> <xsl:output method="text" indent="yes" encoding="Shift_JIS"/> <xsl:strip-space elements="*"/> <!--イントネーション境界以外の母音のリストを取得する--> <!--まず音素ラベル(Phone要素)を見つける--> <xsl:template match="Phone"> <!--Phone要素の属性 PhoneClass の値が「vowel」であるものを探す--> <xsl:if test= "@PhoneClass='vowel'"> <!-- Phone の下位要素 XJToBILabelBreak の値が「3」でないものを探す--> <xsl:if test= "descendant::XJToBILabelBreak != '3'"> <!--条件を満たすときの PhoneEntity 属性の値を表示--> <xsl:value-of select="@PhoneEntity" /> <xsl:text>,</xsl:text> <!--条件を満たすときの XJToBILabelBreak の値を表示--> <xsl:value-of select="descendant::XJToBILabelBreak" /> <xsl:text>,</xsl:text> <!--改行記号を表示--> <xsl:text>
</xsl:text> </xsl:if> </xsl:if> </xsl:template> </xsl:stylesheet>
- XSLTを実行する
- Java
- JavaでHelloWorld XSLT編 の HelloWorldXSLT.java をそのまんま使う。
- Java
- MATLAB
- xslt コマンドが使える。
>> xslt A01F0055.xml makePROMPT.xsl resut.txt
- xslt コマンドが使える。
- 実行結果
- 以下のテキストファイルが出力される。
o,F, o,2, o,1, e,1+p, u,D, (省略)
- 以下のテキストファイルが出力される。
お題:アクセント核を持たない名詞・形容詞のリストを作成する †
お題:HTK学習用の転記テキストファイル(.PROMPTファイル)を作成する †
- 形式
*/(ファイル番号)_(文番号) \t スペース区切りの単語 \t 音素間カンマ区切り(単語間スペース区切り)の発音 \t 開始時間[s] \t 終了時間[s] \t WAVファイルのパス
- 例
*/0001_0005 発表 し ます h,a,Q,py,o,H, sj,i, m,a,s,u, 00005.549 00006.564 /home/CSJ/disc3/A01F0055/A01F0055.wav
- XSLTファイル
- makePROMPT.xsl
- 出力される文字列の例
0005 発表 し ます ハ,ッ,ピョ,ー, シ, マ,ス, 00005.549 00006.564
- コアデータ以外のXMLファイルには、mora層までしかないので、モーラ単位で書き出してjavaプログラムで音素表記に変換します。
- 実行
- 音素・モーラ対応表を準備
- MoraPhonemeList.txt
- 注意 : 長音記号「ー」は、ここでは独立した音素「H」として記述します
- コーパス加工用プログラム/ディレクトリをサーチしてXMLファイルのパスを取得する にしたがって、XMLパスファイル xmlfilelist.txt を作成しておきます。
- makePROMPT.xsl と xmlfilelist.txt と MoraPhonemeList.txt の入ったディレクトリで、HtkMakePromptCSJ.java を実行
java HtkMakePromptCSJ xmlfilelist.txt result.PROMPT MoraPhonemeList.txt sjis
- 最後の引数は MoraPhonemeList.txt の文字コード
- result.PROMPT ファイルができます。
- 音素・モーラ対応表を準備
IPUの開始・終了時間およびノイズマスク区間*2の有無を取得する †
- MATLABでの実行例
xslt('R00M0036.xml', 'searchTimeIPUandNoise.xsl', 'resultNoizeCsj.txt');
音素の開始・終了時間を取得する †
- 【注意!】以下はノイズマスク区間も出力されてしまっています。上記のノイズ区間検出スクリプトと組み合わせて使ってください。
- 母音
- 長母音記号「H」も独立した音素扱いで出力されます。*3
- 子音
- 「SclS」「N」も独立した音素扱いで出力されます。
- 全音素
お題:話者情報を取得する †
現代日本語書き言葉均衡コーパス(BCCWJ) †
お題:短単位ごとに情報を出力する †
文ID,連番(短単位の並び順、10刻み),文境界(Bは文頭、Iはそれ以外),出現形(UniDicの書字形),語彙素読み,語彙素,語彙素細分類,語形,品詞,活用型,活用形,発音形,開始文字位置(形態素に対応する文字列のXML文書中の開始位置),終了文字位置(形態素に対応する文字列のXML文書中の終了位置),原文文字列(元のXML文書における対応する文字列),固定長フラグ(Trueは固定長サンプル内),可変長フラグ(Trueは可変長サンプル内)
- 参考
- スクリプトとサンプルデータとマニュアル
*1 testxsl_1.xsl
*2 CSJのXMLにおいて、Talk - IPU - LUW - SUW - TransSUW 要素の 「TagMaskStart」属性が 1 になっているIPU全体は、ホワイトノイズによってマスクされています。
*3 CSJのXML上では、長母音は/a/,/H/といったように分割されて記述されていますが、/aH/の時間的中心点を境界とした恣意的な分割です(「境界が曖昧である」というラベルがついているはず)。モーラ単位で記述した方が便利だからだと思われます。
添付ファイル: searchTimeIPUandNoise.xsl 1559件 [詳細] searchTimeAllophone.xsl 1635件 [詳細] searchTimeConsonant.xsl 1597件 [詳細] searchTimeVowel.xsl 1611件 [詳細] searchSpeakerInfo.xsl 1588件 [詳細]