[掲示板へもどる]
一括表示

  [No.1391] 対応分析を用いての分類 投稿者:ykawa  投稿日:2013/09/19(Thu) 17:33:40

樋口先生、

お世話になっております。度々質問させて頂いております。
今回、下記のようなことが可能かどうかお聞きしたいと思います。

論文番号
著者名


論文の分野


A,B,C


α


C,D,E


β


A,F,G


γ


C,D,E,G


β


A,B,I


α




上記のようなデータがあったときに、論文の各著者を1つの分野に分類したいのです。
(1人の著者には最も関連の深い分野が割り当てられる。著者Aは分野α、著者Cは分野γなど)
著者名を強制抽出して、分野を外部変数として対応分析すれば、散布図が表示されますが、
このデータを用いて、各著者に最も関連の強い分野を割り当てることは可能でしょうか?
また、可能であれば、著者名と分野のデータをダウンロードする方法もご教示頂ければと思います。

対応分析よりも適切な分析がありましたら、併せてご回答頂ければ幸いです。

お忙しいところ恐縮ですが、よろしくお願いします。


  [No.1392] (再投稿)対応分析を用いての分類 投稿者:ykawa  投稿日:2013/09/19(Thu) 17:40:31

データが見づらいので、再投稿します

樋口先生、

お世話になっております。度々質問させて頂いております。
今回、下記のようなことが可能かどうかお聞きしたいと思います。

論文番号 著者名 論文の分野
1    A,B,C    α
2    C,D,E    β
3    A,F,G    γ
4    C,D,E,G   β
5    A,B,I    α




上記のようなデータがあったときに、論文の各著者を1つの分野に分類したいのです。
(1人の著者には最も関連の深い分野が割り当てられる。著者Aは分野α、著者Cは分野γなど)
著者名を強制抽出して、分野を外部変数として対応分析すれば、散布図が表示されますが、
このデータを用いて、各著者に最も関連の強い分野を割り当てることは可能でしょうか?
また、可能であれば、著者名と分野のデータをダウンロードする方法もご教示頂ければと思います。

対応分析よりも適切な分析がありましたら、併せてご回答頂ければ幸いです。

お忙しいところ恐縮ですが、よろしくお願いします。


  [No.1393] Re:抽出語の分類 投稿者:HIGUCHI Koichi  投稿日:2013/09/22(Sun) 16:53:29

Re:抽出語の分類 (画像サイズ: 846×804 64kB)

こんにちは、樋口です。書き込みありがとうございます。
少し立て込んでいて、ご返信遅くなってしまいました。

お問い合わせのような機能は、KH Coderの機能としては備えておりませんが、
以下のような操作で実現可能です。

1) 著者名を強制抽出し、分野を外部変数として読み込みます
2) メニューから「抽出語」「共起ネットワーク」とたどります
3) 「語―外部変数・見出し」を選択し、分野の外部変数を選択して「OK」
4) 結果をR形式で保存し、KH Coderに添付のRで実行します
     こちらのスライドの2〜5枚目の操作です:
     http://www.slideshare.net/khcoder/r2kh-coder
5) 以下のRコマンドを実行します

co_name  <- NULL
co_value <- NULL
co_chk   <- NULL

for (i in 1:n_words){
    sort <- order( d[,i], decreasing=T )
    same_v <- 0
    if ( d[,i][sort[1]] == d[,i][sort[2]] ){
        same_v <- 1
    }

    co_name  <- c( co_name , colnames(d)[sort[1]] )
    co_value <- c( co_value, d[,i][sort[1]]       )
    co_chk   <- c( co_chk  , same_v               )
}

co <- data.frame(
    word    <- colnames(d)[1:n_words],
    value   <- co_name,
    jaccard <- co_value,
    check   <- co_chk,
    stringsAsFactors=F
)
colnames(co) <- c("word", "value", "jaccard", "check")
print(co)

6) ファイルに保存するには、以下のRコマンドを実行します

write.table(co, file="c:/khcoder/co.csv", sep=",", row.names=F)


1)は既に行っていらっしゃるようですので、2)〜6)の操作が必要になります。
この手順では対応分析を使わず、単に著者名と変数(分野)のJaccard係数を
計算し、係数が一番大きい分野を、その著者の分野としています。万一、Jacc
ard係数が同順一位の分野が存在する場合には、check列が1になります。

添付のスクリーンショットの例では、漱石「こころ」の頻出語を、「上」「中
」「下」のどれかに分類しています。

※対応分析を介さずに素データから直接Jaccard係数を算出しているのは、対
応分析を介することの利点が思い浮かばなかったためです。


  [No.1402] Re:抽出語の分類 投稿者:ykawa  投稿日:2013/09/27(Fri) 13:58:55

樋口先生、

お忙しいところご回答を有難うございました。

教えていた頂いたとおりに行い、無事出力結果を得ることができました。
また、対応分析を介さずに直接Jaccard係数を算出することも理解しました。

1点質問があるのですが、
「万一、Jaccard係数が同順一位の分野が存在する場合には、check列が1になります。」とのことですが、Jaccard係数が同順一位の分野が複数存在する場合、出力ファイルに記載される分野はどのように選ばれるのでしょうか?

以上お手数をおかけしますがよろしくお願いします。


  [No.1403] Re:抽出語の分類 投稿者:HIGUCHI Koichi  投稿日:2013/09/27(Fri) 19:01:08

こんにちは、樋口です。書き込みありがとうございます。

同順1位の場合、選択の基準は特に指定していません。強いて言えば、
Rのソート関数が出力した順番ですが、これがどういう順番かはよく
分かりません(調べていません)。

同順1位がある語、すなわちcheck列に1になっている語は、現状では
一意に分類することには失敗しているというところです。

check列に1がある場合は、jaccard係数以外の基準を加味して判断す
るような処理が必要かもしれません。


  [No.1405] Re:抽出語の分類 投稿者:ykawa  投稿日:2013/09/30(Mon) 14:03:57

樋口先生、

お世話になっております。ご回答有難うございます。
出力ファイルをチェックしたところ、check列が1のものは約20%ありました。

「同順1位の場合、選択の基準は特に指定していません。強いて言えば、
Rのソート関数が出力した順番です」とのことですが、同順位1位の場合には、同順1位の分野にはどのような分野があるのかを確認することは可能でしょうか?

もし可能でしたら、確認の仕方をご教授頂ければ幸いです。

お手数をおかけしますが、よろしくお願いします。


  [No.1406] Re:抽出語の分類 投稿者:HIGUCHI Koichi  投稿日:2013/09/30(Mon) 19:19:36

こんにちは、樋口です。
書き込みありがとうございます。

以下のコードでは、同順1位の場合、同順のカテゴリ名を「・」でつないで両
方表示するようにしました。例えば「上」と「中」が同順1位であれば「上・
中」のように表示されます。

#---------------------------------------------------------------------
co_name <- NULL
co_value <- NULL
co_chk <- NULL

for (i in 1:n_words){
  sort <- order( d[,i], decreasing=T )

  same_v <- 0
  
  cu_value <- d[,i][sort[1]]
  cu_name  <- colnames(d)[sort[1]]
  n <- 2
  
  while (cu_value == d[,i][sort[n]]){
    cu_name <- paste(cu_name, colnames(d)[sort[n]], sep="・")
    same_v <- 1
    n <- n + 1
  }
  
  co_name <- c( co_name , cu_name )
  co_value <- c( co_value, d[,i][sort[1]] )
  co_chk <- c( co_chk , same_v )
}

co <- data.frame(
  word <- colnames(d)[1:n_words],
  value <- co_name,
  jaccard <- co_value,
  check <- co_chk,
  stringsAsFactors=F
)
colnames(co) <- c("word", "value", "jaccard", "check")
print(co)
#---------------------------------------------------------------------

同順1位がそこまで多いというのは、少し不思議ですね。もしかすると、出現
頻度が非常に小さい著者まで分析に含まれているのかもしれません。もしくは、
非常に出現頻度が小さい分野が複数あるのでしょうか。
たとえば10回以上出現している著者のみ(分野のみ)といった形で、分析に含
める著者(分野)を絞れば、同順1位は減るかもしれません。


あるいは、少しアプローチを変えて、ベイズ学習による分類の行うのも一手か
もしれません。手順は以下のようになります。

※ベイズ学習では事前確率を使うので同順1位にはなりにくいはずですが、も
しも同順1位になってしまった場合、なんら警告が出ないままに、片方の分野
が選択される可能性があります。同順1位の有無をチェックするためには、
「分類ログファイルの内容を確認」コマンドを使って、片っ端から確認するし
かありません。

(1) 著者名を強制抽出し、分野名を外部変数として読み込みます
(2) 「ツール」「文書」「ベイズ学習による分類」「外部変数から学習」と進
めます。「学習する外部変数」として分野名の変数を選び、「最小出現数」を
1にして、OKをクリックします。学習結果に名前を付けて保存します。
(3) 以下のような分析対象ファイルを新たなに準備します。1行に1人の著者名
が入っている形にします。
#---------------------------------------------------------------------
著者名1
著者名2
著者名3
著者名4
#---------------------------------------------------------------------
(4) このファイルをKH Coderのプロジェクトとして登録し、著者名を強制抽出
して、前処理を行います。
(5) 「ツール」「文書」「ベイズ学習による分類」「学習結果を用いた自動分
類」とたどります。「学習結果ファイル」として(2)で保存したファイルを選
択肢、適当な「変数名」を指定して「OK」をクリックします。これによって1
行1行が(すなわちそれぞれの著者名)が、いずれかの分野に自動分類されま
す。
(6) 分類結果を取り出すには、「ツール」「外部変数と見出し」「リスト」と
たどります。(5)で名づけた変数を選択して、「出力」をクリックすると、各
行の分類結果を取り出すことができます。


  [No.1407] Re:抽出語の分類 投稿者:ykawa  投稿日:2013/10/01(Tue) 18:07:55

樋口先生、

早速のご対応ありがとうございました。
教えていただいたとおりにやってみました。

(1)jaccard係数による分類について
同順1位のものについて複数分野が表示されました。
(ただ、何度かプログラムを実行していたところ、出力のcoファイルに
結果が上書きではなくて、追加されていってしまいました。上書きにすることはできますか?)

同順1位が多いのは、ご指摘の通り全著者をいずれかの分野に分類して分野ごとに携わっている著者をカウントしたいため、頻度が小さい著者も含まれているためです。

(2)ベイズ学習による分類について
(1)の結果と比較すると、(1)の結果では分野が10以上はあったのに対し、(2)では全著者は4分野に振り分けられていました。
頻度の小さい分野が落ちているようです。

目的に応じて使い分けるのがよいということでしょうか?

お手数お掛けしますが、よろしくお願いします。


  [No.1408] Re:抽出語の分類 投稿者:HIGUCHI Koichi  投稿日:2013/10/01(Tue) 22:49:49

こんにちは、樋口です。書き込みありがとうございます。

> 出力のcoファイルに結果が上書きではなくて、追加

No. 1406のコードに1箇所ミスがあったためでした。
修正しておきました。失礼いたしました。

> (2)ベイズ学習による分類

ベイズ学習では事前確率というものを使うため、お書きいただいたように、多
くの論文を含むような、大きなカテゴリに偏る傾向があるかと思います。

というのも「カテゴリAかカテゴリBか、どちらかよく分からない」という場合
には、AとBのうち、より大きい方のカテゴリに分類します。その方が、正解と
なる確率が高いだろうということです。


以上のような性質を考慮した上で、いずれかの方法を選択していただくことに
なりますでしょうか。(1)出現数が少ない著者については、同順1位の分野が存
在するのもやむを得ないと考えるか、(2)ベイズ的な考え方で(いくらか強引
にでも)1つの分野に分類してしまうか。あるいは(3)ある程度出現数のある著
者だけを分析対象とするか。その後の分析の都合などと併せて、お考えいただ
くのかよいかと存じます。


  [No.1409] Re:抽出語の分類 投稿者:ykawa  投稿日:2013/10/02(Wed) 16:30:06

樋口先生、

お世話になっております。
早速のご回答ありがとうございました。

(1)出力のcoファイルの件
上書きされているのを確認しました。

(2)ベイズ学習による分類
分類の概念を理解しました。今回のサンプルだけでなく、別のサンプルでも試してみて、適切な方法を選択しようと思います。

丁寧にご対応いただき、大変感謝しております。
どうもありがとうございました。