RでXMLテキストにタグ付け


どうやらうまくできたみたいなので、とりあえず保存のために載せておきます。


TEI-XMLでは、構造化のためのマークアップと、名前の明示のためのマークアップの方法が用意されていますが、後者は一括処理ができるはずです。というより、一括処理したほうがいいはずです。タイピングのミスを回避できるし、つける基準が統一しやすいからです。


名前のタグづけというのは、人名・地名・組織名・役職名などのマークアップのことです。TEIでは、name要素とrs要素(referencing string)が用意されています。rs要素のほうが汎用的に使えるので、一括処理でつけるのはこちらに統一しました(このタグについては、TEI Liteに説明があるので、またのちほど訳します)。


用意するのは、タブ区切りのcsvファイルで保存した名前の辞書と、処理を行ないたい文書のファイル。準備は、このふたつを作業フォルダに置いておくだけです。

使い方:

  1. 以下のスクリプトの"INPUT NAME OF THE DICTIONARY"に、辞書のcsvファイル名を入力。
  2. "INPUT NAMES OF ORIGINAL TEXTS"に処理したいファイルの名前を入力。複数指定するときは、c("file1", "file2")のようにカンマで区切る。
  3. ターミナルからRを起動し、スクリプトをはしらせると、オリジナルのファイル名から拡張子を取り除いたものに"_rs-tagged.xml"がつけられたファイルが生成される。


辞書は、スプレッド・シート等で、3つのコラムをつかって、次のように作っておきます。

PL0802 Hachioji place
  • 第一のセルが名前に与えられるコード。rs要素の@key属性の値になります。
  • 第二のセルが検索をかけたい名前の文字列
  • 第三のセルが名前の種類。rs要素の@type属性の値になります。


これをタブ区切りのcsvファイルにして作業フォルダに保存しておきます。この情報をもとに、「Hachioji」という文字列をテキスト中にみつけたら、つぎのように置換します。


..... Hachioji ....


改善したほうがいい点は多々あると思います。あまりプログラムを書くのは得意ではないので、改善できる点がありましたら、教えていただけるととても助かります。



# タブ区切りのcsvファイルからTEIのrs要素を一括変換する
# 1. スプレッド・シートなどでrs (reference strings)要素のリストをつくっておく。
# 2. つくったものをタブ区切りのcsvファイルとして作業フォルダに保存。(OpenOfficeの場合:[file]->[save as]->".csv"という拡張子をつけてファイル保存。そのとき"edit filter settings"チェックボックスにチェックをいれる。つぎの画面で、[Field delimiter]->"{Tab}"に、[Text delimiter]->空白に。>OK)
# 3. 以下のコードの"INPUT NAME OF THE DICTIONARY"に、つくったcsvファイル名を入力。
# 4. "INPUT NAMES OF ORIGINAL TEXTS"に処理したいファイルの名前を入力。複数指定するときは、c("file1", "file2")のようにカンマで区切る。
# 5. スクリプトをコピー -> ターミナルに貼り付け -> はしらせる。
# 6. 入力したファイル名から拡張子を取り除いたものに"_rs-tagged.xml"がつけられたファイルが生成される。

#課題:"dict.r"ファイルをcatで書き出さなくてもいいような気がする。

rm(list=ls(all=T))

dictionary <- c("INPUT NAME OF THE DICTIONARY")
original_text <- c("INPUT NAMES OF ORIGINAL TEXTS")

for (f in dictionary){
cat(f, "is being processed...\n")
current_file <- scan(f, what="char", sep="\n", quiet=T)
current_file <- gsub("^\t.*$", "", current_file, perl=T) #erase unnessesary lines
current_file <- gsub("&(?!\\w*?;)", "&amp;", current_file, perl=T) #format "&amp;"

body <- gsub("(.*?)\t(.*?)\t(.*)", " i <- gsub\\(\"\\2\\(\\?\\!\\(\\\\\\\\w\\| \\|&amp;\\)\\*\\?\\)\"\\, \"\\2\"\\, i\\, perl=T\\)", current_file, perl=T)

cat(body, file="dict.r", sep="\n")
}

for (f in original_text){
cat(f, "is being processed...\n")
i <- scan(f, what="char", sep="\n", quiet=T)
i <- gsub("&(?!\\w*?;)", "&amp;", i, perl=T) #format "&amp;"

i <- gsub("", "", i, perl=T) #erase existing tag
i <- gsub("
", "", i, perl=T) #erase esxisting tag

source("dict.r")

i <- gsub("s", "s", i, perl=T)
filename <- gsub("(.*)\\..*", "\\1_rs-tagged.xml", f, perl=T)
cat(i, file=filename, sep="\n")
}