2

R を使用して、次の例のようにフォーマットされたスクリプトからスピーカーを抽出したいと考えています。

「シーン 6: 第二の主: いいえ、私の主よ、彼をやめさせてください。彼に道を譲らせてください.バートラム: 私は彼にそんなに騙されていると思いますか?最も注目に値する臆病者、際限のない嘘つき、時間ごとの約束を破る者、あなたの領主の娯楽に値する優れた資質の所有者はいません。」

この例では、("Second Lord"、"First Lord"、"Second Lord"、"BERTRAM"、"Second Lord") を抽出します。ルールは明らかです。それは、文の終わりとセミカラムの間に位置する単語のグループです。

これを R でどのように書くことができますか?

4

3 に答える 3

4

多分このようなもの:

library(stringr)  
body <- "Scene 6: Second Lord: Nay, good my lord, put him to't; let him have his way. First Lord: If your lordship find him not a hilding, hold me no more in your respect. Second Lord: On my life, my lord, a bubble. BERTRAM: Do you think I am so far deceived in him? Second Lord: Believe it, my lord, in mine own direct knowledge, without any malice, but to speak of him as my kinsman, he's a most notable coward, an infinite and endless liar, an hourly promise-breaker, the owner of no one good quality worthy your lordship's entertainment." 
p <- str_extract_all(body, "[:.?] [A-z ]*:")

# and get rid of extra signs
p <- str_replace_all(p[[1]], "[?:.]", "")
# strip white spaces
p <- str_trim(p)
p
"Second Lord" "First Lord"  "Second Lord" "BERTRAM"     "Second Lord"

# unique players
unique(p)
[1] "Second Lord" "First Lord"  "BERTRAM"  

正規表現の説明: (完全ではありません)

str_extract_all(body, "[:.?] [A-z ]*:")一致は、:または.または?( [:.?]) のいずれかで始まり、その後に空白が続きます。次の まで、任意の文字と空白が一致し:ます。

位置を取得

str_locate_all同じ正規表現で使用できます:

str_locate_all(body, "[:.?] [A-z ]*:")
于 2012-07-06T08:02:43.203 に答える
3

gsubfn/straplyc

x入力文字列がどこにあるかを試してください。ここでstrapplycは、括弧内の一致部分を返します。

> library(gsubfn)
> strapplyc(x, "[.?:] *([^:]+):", simplify = c)
[1] "Second Lord" "First Lord"  "Second Lord" "BERTRAM"     "Second Lord"

gregexpr

これが2番目の方法です。外部パッケージは使用しません。ここでは、開始位置と終了位置 (start.posおよびend.pos) を計算し、それらが定義する文字列を抽出します。

> pos <- gregexpr("[.?:] [^:]+:", x)[[1]]
> start.pos <- pos + 2
> end.pos <- start.pos + attr(pos, "match.length") - 4
> substring(x, start.pos, end.pos)
[1] "Second Lord" "First Lord"  "Second Lord" "BERTRAM"     "Second Lord"
于 2012-07-06T10:37:55.107 に答える
2

少なくともこの場合は、より構造化された形式でテキストを検索することをお勧めします。構造化文書のマイニングは、ほとんどの場合、非構造化文書よりも簡単です。ソースがシェイクスピアであるため、インターネット上には多くのコピーが浮かんでいます。

script_url <- "http://www.opensourceshakespeare.org/views/plays/play_view.php?WorkID=allswell&Act=3&Scene=6&Scope=scene"
doc <- htmlParse(script_url)
character_links <- xpathApply(doc, '//li[@class="playtext"]/strong/a')
characters <- unique(sapply(character_links, xmlValue))
#[1] "Second Lord" "First Lord"  "Bertram"     "Parolles"

使用するテキストのバージョンによって大きな違いが生じることに注意してください。Open Source Shakespeare は、HTML ページが適切に構造化され、クラスが含まれているという点で非常に優れています。一方、バートルビーページはそうではありません。分析をもう一度実行しましょう。

script_url2 <- "http://www.bartleby.com/70/2236.html"
doc2 <- htmlParse(script_url2)
tbl <- xpathApply(doc2, '//table[@width="100%"]')[[1]]
italics <- xpathApply(tbl, '//tr/td/i')
characters2 <- unique(sapply(italics, xmlValue))
#[1] "First Lord." "Sec. Lord."  "Ber."        "Par."        "hic jacet."  "Exit."      
#[7] "Ber"         "Exeunt."

この場合、登場人物、舞台演出 (可能な舞台演出のリストをコンパイルしてそれらを無視しない限り)、および強調されたスピーチの違いをプログラムで区別することはできません。テキストソースを賢く選択してください!

于 2012-07-06T12:16:32.567 に答える