テキストフラグメントのパラメーターを使用したテンプレートの識別


7

パラメータを含むことができる固定構造のテキストフラグメントを含むデータセットがあります。次に例を示します。

 Temperature today is 20 centigrades
 Temperature today is 28 centigrades

または

 Her eyes are blue and hair black.
 Her eyes are green and hair brown.

最初の例は、1つの数値パラメーターを持つテンプレートを示しています。2つ目は、2つの因子パラメーターを持つテンプレートです。

テンプレートの数とパラメータの数は不明です。

問題は、テンプレートを識別し、各テキストフラグメントを対応するテンプレートに割り当てることです。

明白な最初のアイデアは、クラスタリングを使用することです。距離測定は、一致しない単語の数として定義されます。つまり、例1のレコードの距離は1で、例2の距離は2です。例1と2のレコード間の距離は7です。この方法は適切に機能し、クラスターの数がわかっている場合はそうではありません。役に立たない。

距離行列をスキャンして、距離1(または2、3、...)に多くの近傍を持つレコードを検索するプログラムによるアプローチを想像できますが、監視されていない機械学習アルゴリズムを適用して問題を解決できるかどうか知りたいです。Rが推奨されますが、必須ではありません。


1
コーパス全体でLSAを実行してから、クラスタリングアルゴリズムで対応するスコアを使用しないのはなぜですか?これは、テンプレートごとに数値パラメーターが異なるという事実を簡単に処理します。次に、クラスターの数を見つけることは、標準的な方法論の手順に従います(たとえば、 -means / AIC)。kk
usεr11852

@usεr11852私はあなたの提案に感謝していますが、興味深いことに、TermDocumentMatrix(tm)で単純な距離を使用して、LSAを使用した方が良い結果が得られます。これは、テンプレートの固定構造によるものだと思います。たとえば、用語の順序は距離に関連しています。私は直感的に、おそらく距離マトリックスに基づいた、私の問題の簡単な基本的な解決策があるはずだと思いますが、あなたの提案を答えとして公式化してください。
Marmite爆撃機

@usεr11852LSAの問題は、1)短期間の無視に関する問題-パラメータwordLengths 2)変換されていないIDFアプリケーションによって引き起こされました。両方の問題に対処する答えを追加しました。
マルミット爆撃機

回答:


3

以下の提案の背後にある基本的な理論的根拠は、「固有ベクトル」と「テンプレート」を関連付けることです。

特に、bag-of-wordsに基づいてコーパス全体でLSAを使用できます。結果の固有ベクトルは、代理テンプレートとして機能します。これらの固有ベクトルは、各テンプレートの単語数に直接影響されるべきではありません。その後、スコアを使用して、標準的な手順(AICと組み合わせた平均など)に従ってドキュメントをクラスター化できます。LSAの代わりとして、NNMFを使用できます。LSA(またはNNMF)は、生の単語数マトリックスではなく、変換されたTF-IDFに対して実行する必要があることを指摘しておきます。k


パラメータとテンプレートの用語を区別するために、変換されたIDFに基づく回答を追加しました。これは変換されたIDFを初めて使用するため、このアプローチについてコメントをいただければ幸いです。
Marmite爆撃機

1
お役に立ててよかったです。
usεr11852

3

コーパス内のフレーズを識別するためにword2vecを使用することを検討してください。(単一のトークンの代わりに)フレーズの存在は、「テンプレート」を示している可能性があります。

ここから、テンプレートフレーズに最も類似したトークンが、パラメーターの値である可能性があります。


提案をありがとう。これは、修正パーツ(テンプレート)が先行し、その後にパラメーターが続く場合に正常に機能します。「Temperature today is」はフレーズとして認識しますが、この例では、20摂氏がパラメーターであるかテンプレートの一部であるかを区別するのにおそらく問題があります。
マーマイト爆撃機

正しい-しかし、「Temperature today is is」に最も類似している単語をリストすると、「centrigrade」は基本的にまったく同じ(したがってテンプレートの一部)であるのに対し、「20」(または他の温度)であると予想されます。かなり似ていますが、それほどではありません。
jamesmf 2015

1

以下のスクリプトでは、変換されたIDFを使用してLSAを使用し、テンプレートからパラメーターを切り離しています。考え方としては、IDFがいくつかのしきい値よりも高いすべての項がパラメーターと見なされ、その頻度がゼロにリセットされます。しきい値は、コーパス内のテンプレートの平均出現数で概算できます。パラメータを削除すると、同じテンプレートを持つレコードの距離はゼロになります。

 library(tm)
 library(lsa)
 df <- data.frame(TEMPLATE = c(rep("A",3),rep("B",3),rep("C",3)),
 TEXT = c(
 paste("Temperature today is",c(28,24,20),"centigrades"),
 paste("Temperature today is",c(82,75,68),"Fahrenheit"),
 paste("Her eyes are ",c("blue","black","green"), "and hair",c("grey","brown","white"))) , stringsAsFactors=FALSE)
> df     
   TEMPLATE                                TEXT
 1        A Temperature today is 28 centigrades
 2        A Temperature today is 24 centigrades
 3        A Temperature today is 20 centigrades
 4        B  Temperature today is 82 Fahrenheit
 5        B  Temperature today is 75 Fahrenheit
 6        B  Temperature today is 68 Fahrenheit
 7        C    Her eyes are  blue and hair grey
 8        C  Her eyes are  black and hair brown
 9        C  Her eyes are  green and hair white

 corpus <- Corpus(VectorSource(df$TEXT))
 td <- as.matrix(TermDocumentMatrix(corpus,control=list(wordLengths = c(1, Inf)) ))

 > td             Docs
 Terms         1 2 3 4 5 6 7 8 9
   20          0 0 1 0 0 0 0 0 0
   24          0 1 0 0 0 0 0 0 0
   28          1 0 0 0 0 0 0 0 0
   68          0 0 0 0 0 1 0 0 0
   75          0 0 0 0 1 0 0 0 0
   82          0 0 0 1 0 0 0 0 0
   and         0 0 0 0 0 0 1 1 1
   are         0 0 0 0 0 0 1 1 1
   black       0 0 0 0 0 0 0 1 0
   blue        0 0 0 0 0 0 1 0 0
   brown       0 0 0 0 0 0 0 1 0
   centigrades 1 1 1 0 0 0 0 0 0
   eyes        0 0 0 0 0 0 1 1 1
   fahrenheit  0 0 0 1 1 1 0 0 0
   green       0 0 0 0 0 0 0 0 1
   grey        0 0 0 0 0 0 1 0 0
   hair        0 0 0 0 0 0 1 1 1
   her         0 0 0 0 0 0 1 1 1
   is          1 1 1 1 1 1 0 0 0
   temperature 1 1 1 1 1 1 0 0 0
   today       1 1 1 1 1 1 0 0 0
   white       0 0 0 0 0 0 0 0 1

 ## supress terms with idf higher than template frequency
 ## those terms are considered as parameters
 template_freq <- 3
 tdw <- lw_bintf(td) * ifelse(gw_idf(td)> template_freq,0, gw_idf(td))
 dist <- dist(t(as.matrix(tdw)))

 > dist
          1        2        3        4        5        6        7        8
 2 0.000000                                                               
 3 0.000000 0.000000                                                      
 4 3.655689 3.655689 3.655689                                             
 5 3.655689 3.655689 3.655689 0.000000                                    
 6 3.655689 3.655689 3.655689 0.000000 0.000000                           
 7 6.901341 6.901341 6.901341 6.901341 6.901341 6.901341                  
 8 6.901341 6.901341 6.901341 6.901341 6.901341 6.901341 0.000000         
 9 6.901341 6.901341 6.901341 6.901341 6.901341 6.901341 0.000000 0.000000

距離マトリックスは、レコード1、2、3が同じテンプレートからのものであることを明確に示しています(距離= 0、合成データ。実際の場合、いくつかの小さなしきい値を使用する必要があります)。同じことがレコード4、5、6および7、8、9にも当てはまります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.