RでXMLテキストにタグ付け
どうやらうまくできたみたいなので、とりあえず保存のために載せておきます。
TEI-XMLでは、構造化のためのマークアップと、名前の明示のためのマークアップの方法が用意されていますが、後者は一括処理ができるはずです。というより、一括処理したほうがいいはずです。タイピングのミスを回避できるし、つける基準が統一しやすいからです。
名前のタグづけというのは、人名・地名・組織名・役職名などのマークアップのことです。TEIでは、name要素とrs要素(referencing string)が用意されています。rs要素のほうが汎用的に使えるので、一括処理でつけるのはこちらに統一しました(このタグについては、TEI Liteに説明があるので、またのちほど訳します)。
用意するのは、タブ区切りのcsvファイルで保存した名前の辞書と、処理を行ないたい文書のファイル。準備は、このふたつを作業フォルダに置いておくだけです。
使い方:
- 以下のスクリプトの"INPUT NAME OF THE DICTIONARY"に、辞書のcsvファイル名を入力。
- "INPUT NAMES OF ORIGINAL TEXTS"に処理したいファイルの名前を入力。複数指定するときは、c("file1", "file2")のようにカンマで区切る。
- ターミナルから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*?;)", "&", current_file, perl=T) #format "&"body <- gsub("(.*?)\t(.*?)\t(.*)", " i <- gsub\\(\"\\2\\(\\?\\!\\(\\\\\\\\w\\| \\|&\\)\\*\\?\\)\"\\, \"
\\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*?;)", "&", i, perl=T) #format "&"i <- gsub("
", "", i, perl=T) #erase existing tag ", "", i, perl=T) #erase esxisting tag
i <- gsub("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")
}