Concordance to Pushkin, prototype

連休に入った今日,プーシキン作品コンコーダンス・プログラム試作品に取り組んだ。共有メモリ上にコーパス(全作品テキストデータ),作品名 DB(コーパス ID から作品名を引き当てるデータベース),出現する単語を見出語形式で保持する二分木データベースを構築するのに,おそろしく時間を要したけれども,やっとプロトタイプにこぎ着けた。コーパス,作品名 DB,単語二分木のローダーと,これらのデータを用いてユーザ指定条件に合致する KWIC コンコーダンス表を生成する C++ アプリ。

現行版コンコーダンス・プログラム Опыт динамического составления конкордации к текстам А. С. Пушкина に対し,今回の改良点は以下の通り。

  1. 見出語ベース(UTF-8 ロシア語 Lemmatizer 形態素解析に基づく)
  2. 正規表現による柔軟な対象語指定が可能
  3. 近接隣接演算のサポート
  4. 単語出現位置情報から作品名が参照可能
  5. 単語出現位置情報から作品 Web ページの該当部分にリンクが可能
  6. ほぼメモリ上のみでデータ処理を行うので比較的高速

近接隣接演算というのは,ある語と何行以内,何語以内の範囲に出現するという条件指定でのコンコーダンス対象語検索である。例えば,「A<W10>B」 という検索式で,語 B と 10 語以内で共起する語 A の KWIC コンコーダンスを生成する。"W" が "L" だと行単位で同じ計算を行う。作品内の語,行の位置情報を単語に付加して管理するので,こうした計算が可能なのである。

プロトタイプなのでまだコンソールアプリである。これを近々 Web で使えるようにしたいと考えている。『エヴゲーニイ・オネーギン』全編のみをコーパスとしてロードし,近接隣接演算を試してみた。.*УКА$<W5>.*УКА$ という条件。.*УКА$ マッチ語と5 語範囲内で共起する .*УКА$ マッチ語について KWIC を生成する指定である。.*УКА$ という正規表現は,任意の文字ではじまり語末尾が УКА である条件に適合する語を示す。

結果は以下の通り。最初の出力は,МУКА が 1 件ヒットしたことを示す。コンテキスト中の該当行・単語を強調表示タグ装飾してある。4 語前に порукой (見出語 порука) という語があるので,近接隣接条件に合致する。03:0836:002129 は位置情報(『エヴゲーニイ・オネーギン』の 2129 行目)である。あとに,作品名と,Web ページの該当行へのリンクが続く。

Expression: .*УКА$<W5>.*УКА$
МУКА    1
1   Поверьте (совесть в том порукой), <span class="hitl">Супружество 
нам будет <em>мукой</em>.</span> Я, сколько ни любил бы вас,
    03:0836:002129  Роман в стихах. "Евгений Онегин"
    http://yasuda.homeip.net/pushkin/web/0836.html#002272
НАУКА   3
2   И лучше выдумать не мог. <span class="hitl">Его пример другим 
<em>наука</em>;</span> Но, боже мой, какая скука
    03:0836:000025  Роман в стихах. "Евгений Онегин"
    http://yasuda.homeip.net/pushkin/web/0836.html#000022
3   Хоть и ему иные штуки <span class="hitl">Не проходили без 
<em>науки</em>,</span> Хоть иногда и сам впросак
    03:0836:003294  Роман в стихах. "Евгений Онегин"
    http://yasuda.homeip.net/pushkin/web/0836.html#003516
4   И не входила глубоко <span class="hitl">В сердца мятежная 
<em>наука</em>,</span> Все это было только скука,
    03:0836:005763  Роман в стихах. "Евгений Онегин"
    http://yasuda.homeip.net/pushkin/web/0836.html#006098
ПОРУКА  1
5   Их вовсе недостоин я. <span class="hitl">Поверьте (совесть в том 
<em>порукой</em>),</span> Супружество нам будет мукой.
    03:0836:002128  Роман в стихах. "Евгений Онегин"
    http://yasuda.homeip.net/pushkin/web/0836.html#002271
РУКА    4
6   Они сидят в потемках двое; <span class="hitl">Они в саду, 
<em>рука</em> с рукой,</span> Гуляют утренней порой;
    03:0836:002284  Роман в стихах. "Евгений Онегин"
    http://yasuda.homeip.net/pushkin/web/0836.html#002438
7   Они сидят в потемках двое; <span class="hitl">Они в саду, рука с 
<em>рукой</em>,</span> Гуляют утренней порой;
    03:0836:002284  Роман в стихах. "Евгений Онегин"
    http://yasuda.homeip.net/pushkin/web/0836.html#002438
8   Но кушать подали. Четой <span class="hitl">Идут за стол 
<em>рука</em> с рукой.</span> Теснятся барышни к Татьяне;
    03:0836:003017  Роман в стихах. "Евгений Онегин"
    http://yasuda.homeip.net/pushkin/web/0836.html#003221
9   Но кушать подали. Четой <span class="hitl">Идут за стол рука с 
<em>рукой</em>.</span> Теснятся барышни к Татьяне;
    03:0836:003017  Роман в стихах. "Евгений Онегин"
    http://yasuda.homeip.net/pushkin/web/0836.html#003221
СКУКА   2
10  Его пример другим наука; <span class="hitl">Но, боже мой, какая 
<em>скука</em></span> С больным сидеть и день и ночь,
    03:0836:000026  Роман в стихах. "Евгений Онегин"
    http://yasuda.homeip.net/pushkin/web/0836.html#000023
11  В сердца мятежная наука, <span class="hitl">Все это было только 
<em>скука</em>,</span> Безделье молодых умов,
    03:0836:005764  Роман в стихах. "Евгений Онегин"
    http://yasuda.homeip.net/pushkin/web/0836.html#006099
ШТУКА   1
12  Иль явно, иль исподтишка, <span class="hitl">Хоть и ему иные 
<em>штуки</em></span> Не проходили без науки,
    03:0836:003293  Роман в стихах. "Евгений Онегин"
    http://yasuda.homeip.net/pushkin/web/0836.html#003515