異なるngramカウント(Uni、Bi、Tri)から作成された3つのデータフレームがあり、各データフレームには分離されたngram、頻度カウント(n)が含まれ、平滑化を使用して確率が追加されています。
テーブルを調べて、入力文字列に基づいて最も可能性の高い単語を返す 3 つの関数を作成しました。そしてそれらを縛った
##Prediction Model
trigramwords <- function(FirstWord, SecondWord, n = 5 , allow.cartesian =TRUE) {
probword <- trigramtable[.(FirstWord, SecondWord), allow.cartesian = TRUE][order(-Prob)]
if(any(is.na(probword)))
return(bigramwords(SecondWord, n))
if(nrow(probword) > n)
return(probword[1:n, ThirdWord])
count <-nrow(probword)
bgramwords <- bigramtable(SecondWord, n)[1:(n - count)]
return(c(probword[, ThirdWord], bgramwords))
}
bigramwords <- function(FirstWord, n = 5 , allow.cartesian = TRUE){
probword <- bigramtable[FirstWord][order(-Prob)]
if(any(is.na(probword)))
return(Unigramword(n))
if (nrow(probword) > n)
return(probword[1:n, SecondWord])
count <- nrow(probword)
word1 <- Unigramword(n)[1:(n - count)]
return(c(probword[, SecondWord], word1))
}
##Back off Model
Unigramword <- function(n = 5, allow.cartesian = TRUE){
return(sample(UnigramTable[, FirstWord], size = n))
}
## Bind Functions
predictword <- function(str) {
require(quanteda)
tokens <- tokens(x = char_tolower(str))
tokens <- char_wordstem(rev(rev(tokens[[1]])[1:2]), language = "english")
words <- trigramwords(tokens[1], tokens[2], 5)
chain_1 <- paste(tokens[1], tokens[2], words[1], sep = " ")
print(words[1])
}
ただし、次の警告メッセージが表示され、出力は常に同じ単語です。バイグラムワード関数のみを使用すると正常に動作しますが、トライグラム関数を追加すると警告メッセージが表示されます。1:n が正しく定義されていないためだと思います。
Warning message:
In 1:n : numerical expression has 5718534 elements: only the first used