7

データベースに大きなテーブルがあり、さまざまなテキストの単語がテキスト順にたくさん含まれています。いくつかの単語のセットが一緒に現れる回数/頻度を見つけたいです。

:私が多くのテキストにこの4つの単語を持っていると仮定します:United | States | of | America。結果として次のようになります。

アメリカ合衆国:50
アメリカ合衆国:45
アメリカ合衆国:40

(これは4語の例にすぎませんが、4語より少ない場合も多い場合もあります)。

これまたはこれに類似したことを行うことができるいくつかのアルゴリズムがありますか?

編集:方法を示すいくつかのRまたはSQLコードは大歓迎です。私がしなければならないことの実際的な例が必要です。

テーブル構造

私は2つのテーブルを持っています:持ってTokenいるidtext。テキストはisでUNIQUEあり、この表の各入り口は異なる単語を表しています。

TextBlockHasTokenテキストの順序を保持するテーブルです。各行は、テキスト内の単語を表します。

それtextblockidは、トークンが属するテキストのブロックです。sentenceつまり、トークンpositionのセンテンス、つまりセンテンス内のトークンの位置でtokenidあり、トークンテーブルの参照です。

4

4 に答える 4

14

これはNグラムと呼ばれます。あなたの場合は4グラム。確かにマルコフ連鎖の副産物として取得できますが、スライディングウィンドウ(サイズ4)を使用して、4次元の「ヒストグラム」を更新しながら(線形)テキストをウォークスルーすることもできます。

更新2011-11-22:マルコフ連鎖は、現在の状態が与えられた場合に、新しい状態に切り替わる確率をモデル化する方法です。これは、「ステートマシン」の確率論的同等物です。自然言語の場合、「状態」は「前のN語」によって形成されます。これは、事前確率(前のN語の前)をequal_to_oneと見なすことを意味します。コンピューターの人々は、NLPの場合にマルコフ連鎖を実装するためにツリーを使用する可能性が最も高いでしょう。「状態」は、ルートから現在のノードまでのパスであり、words_to_followの確率は、現在のノードの子孫の確率です。しかし、新しい子ノードを選択するたびに、実際にはツリーを下にシフトし、ルートノードを「忘れる」と、ウィンドウの幅はNワードだけになります。

このようにマルコフ連鎖/木を歩いている場合、最初の単語の前の確率はいつでも1であり、最初の単語の後の確率はP(w1)であり、2番目の単語の後の確率はP(w2)であることが簡単にわかります。 || w1など。したがって、コーパスを処理するときに、マルコフツリーを構築します(:=ノードの頻度を更新します)。ライドの最後に、freq(word)/SUMによって特定の単語の選択の確率を推定できます。 (freq(siblings))。ツリーの奥深くにある単語の場合、これは前の4つの単語が与えられた場合の単語の確率です。Nグラムの確率が必要な場合は、ルートから最後の単語までのパスにあるすべての確率の積が必要です。

于 2011-11-09T18:23:00.583 に答える
4

これは、マルコフ連鎖の典型的な使用例です。テキストベースからマルコフモデルを推定し、遷移表で高い確率を見つけます。これらは、ある単語が別の単語に続く確率を示しているため、フレーズは高い遷移確率として表示されます。

フレーズの始まりの単語がテキストに現れた回数を数えることによって、絶対数を導き出すこともできます。

于 2011-11-09T18:14:17.577 に答える
2

Here is a small snippet that calculates all combinations/ngrams of a text for a given set of words. In order to work for larger datasets it uses the hash library, though it is probably still pretty slow...

require(hash)

get.ngrams <- function(text, target.words) {
  text <- tolower(text)
  split.text <- strsplit(text, "\\W+")[[1]]
  ngrams <- hash()
  current.ngram <- ""
  for(i in seq_along(split.text)) {
    word <- split.text[i]
    word_i <- i
    while(word %in% target.words) {
      if(current.ngram == "") {
        current.ngram <- word
      } else {
        current.ngram <- paste(current.ngram, word)
      }
      if(has.key(current.ngram, ngrams)) {
        ngrams[[current.ngram]] <- ngrams[[current.ngram]] + 1
      } else{
        ngrams[[current.ngram]] <- 1
      }
      word_i <- word_i + 1
      word <- split.text[word_i]
    }
    current.ngram <- ""
  }
  ngrams
}

So the following input ...

some.text <- "He states that he loves the United States of America,
 and I agree it is nice in the United States."
some.target.words <- c("united", "states", "of", "america")

usa.ngrams <- get.ngrams(some.text, some.target.words)

... would result in the following hash:

>usa.ngrams
<hash> containing 10 key-value pair(s).
  america : 1
  of : 1
  of america : 1
  states : 3
  states of : 1
  states of america : 1
  united : 2
  united states : 2
  united states of : 1
  united states of america : 1

Notice that this function is case insensitive and registers any permutation of the target words, e.g:

some.text <- "States of united America are states"
some.target.words <- c("united", "states", "of", "america")
usa.ngrams <- get.ngrams(some.text, some.target.words)

...results in:

>usa.ngrams
<hash> containing 10 key-value pair(s).
  america : 1
  of : 1
  of united : 1
  of united america : 1
  states : 2
  states of : 1
  states of united : 1
  states of united america : 1
  united : 1
  united america : 1
于 2011-11-21T11:09:26.520 に答える
1

それがあなたに役立つかどうかはわかりませんが、ここに私が約1年前に書いたNグラム(まあ、モノグラム、バイグラム、トリグラムのみ)を数える小さなPythonプログラムがあります。(各Nグラムのエントロピーも計算します)。私はそれを使用して、大きなテキストでそれらのNグラムをカウントしました。 リンク

于 2011-11-16T19:52:05.813 に答える