.TextGrid
(Praatプログラムによって生成された)と呼ばれる「セグメンテーションファイル」を処理しようとしています。)
元の形式は次のようになります。
File type = "ooTextFile"
Object class = "TextGrid"
xmin = 0
xmax = 243.761375
tiers? <exists>
size = 17
item []:
item [1]:
class = "IntervalTier"
name = "phones"
xmin = 0
xmax = 243.761
intervals: size = 2505
intervals [1]:
xmin = 0
xmax = 0.4274939687384032
text = "_"
intervals [2]:
xmin = 0.4274939687384032
xmax = 0.472
text = "v"
intervals [3]:
[...]
(これは、ファイル内の n 項目 (注釈のレイヤー) に対して [3 から n] の間隔で、EOF まで繰り返されます。
誰かがrPython R package を使用したソリューションを提案しました。
不運にも :
- 私はPythonについて十分な知識を持っていません
- rPython のバージョンは、R.3.0.2 (私が使用しています) では使用できません。
- 私の目的は、このパーサーを R 環境でのみ分析するために開発することです。
現在、私の目的は、このファイルを複数のデータ フレームに分割することです。各データフレームには、1 つの項目 (注釈のレイヤー) が含まれている必要があります。
# Load the Data
txtgrid <- read.delim("./xxx_01_xx.textgrid", sep=c("=","\n"), dec=".", header=FALSE)
# Erase White spaces (use stringr package)
txtgrid[,1] <- str_trim(txtgrid[,1])
# Convert row.names to numeric
num.row<- as.numeric(row.names(txtgrid))
# Redefine the original textgrid and add those rows (I want to "keep them in case for later process)
txtgrid <- data.frame(num.row,txtgrid)
colnames(txtgrid) <- c("num.row","object", "value")
head(txtgrid)
の出力head(txtgrid)
は非常に生なので、ここに textgrid の最初の 20 行を示しますtxtgrid[1:20,]
。
num.row object value
1 1 File type ooTextFile
2 2 Object class TextGrid
3 3 xmin 0
4 4 xmax 243.761375
5 5 tiers? <exists>
6 6 size 17
7 7 item []:
8 8 item [1]:
9 9 class IntervalTier
10 10 name phones
11 11 xmin 0
12 12 xmax 243.761
13 13 intervals: size 2505
14 14 intervals [1]:
15 15 xmin 0
16 16 xmax 0.4274939687384032
17 17 text _
18 18 intervals [2]:
19 19 xmin 0.4274939687384032
20 20 xmax 0.472
前処理したので、次のことができます。
# Find the number of the rows where I want to split (i.e. Item)
tier.begining <- txtgrid[grep("item", txtgrid$object, perl=TRUE), ]
# And save those numbers in a variable
x <- as.numeric(row.names(tier.begining))
この変数x
は、データを複数のデータフレームに分割する必要がある数値-1 を提供します。
私は18個のアイテムを持っています-1(最初のアイテムはitem []で、他のすべてのアイテムが含まれています。したがって、ベクトルx
は次のとおりです。
x
[1] 7 8 10034 14624 19214 22444 25674 28904 31910 35140 38146 38156 38566 39040 39778 40222 44800
[18] 45018
Rにどのように伝えることができますか:このデータフレームを複数のデータフレームに分割textgrids$nameoftheItem
して、アイテムと同じ数のデータフレームを取得するようにするにはどうすればよいですか?たとえば:
textgrid$phones
item [1]:
class = "IntervalTier"
name = "phones"
xmin = 0
xmax = 243.761
intervals: size = 2505
intervals [1]:
xmin = 0
xmax = 0.4274939687384032
text = "_"
intervals [2]:
xmin = 0.4274939687384032
xmax = 0.472
text = "v"
[...]
intervals [n]:
textgrid$syllable
item [2]:
class = "IntervalTier"
name = "syllable"
xmin = 0
xmax = 243.761
intervals: size = 1200
intervals [1]:
xmin = 0
xmax = 0.500
text = "ve"
intervals [2]:
[...]
intervals [n]:
textgrid$item[n]
使いたかった
txtgrid.new <- split(txtgrid, f=x)
しかし、このメッセージは正しいです:
Warning message: In split.default(x = seq_len(nrow(x)), f = f, drop = drop, ...) : data length is not a multiple of split variable
目的の出力が得られません。行番号が連続しておらず、ファイルがすべて混同されているようです。
which
, daply
(from plyr
) &関数もいくつか試しsubset
ましたが、正しく動作しませんでした!
このデータを適切かつ効率的に構造化するためのアイデアを歓迎します。理想的には、項目 (注釈のレイヤー) をそれらの間 (異なるレイヤーの xmin & xmax) と複数の textgrid ファイルにリンクできるようにする必要がありますが、これはほんの始まりにすぎません。