2016-06-10 22 views
1

我正在使用R-tm-Rweka包進行一些文本挖掘。我不需要在單個單詞上構建一個tf-tdm,但這不足以達到我的目的,我必須提取ngram。我用@Ben函數TrigramTokenizer <- function(x) NGramTokenizer(x, Weka_control(min = 2, max = 3)) tdm <- TermDocumentMatrix(a, control = list(tokenize = TrigramTokenizer))
來提取卦。輸出有一個明顯的錯誤,見下文。它會提取4個,3個和2個單詞的短語。理想情況下,它應該只拾取4個字的名詞短語,並放棄(3個和2個字)的休息。我如何強制這個解決方案,就像Python NLTK有一個備份標記器選項一樣?如何在RWeka中實現備份標記器開關?

抽象的戰略->this is incorrect>
抽象的戰略棋盤->incorrect
抽象的戰略棋盤遊戲-> this should be the correct output

埃森哲高管
埃森哲執行簡單
埃森哲執行簡單的評論

非常感謝。

+0

所以,總結一下,你想做2克和3克,對吧? –

+0

說:首先嚐試4克,然後嘗試3個字窗口,然後嘗試2個字窗口,失敗一個單詞。但只報告最大的相關項目(不要重複4-,3-,2字短語) – Pradeep

回答

0

我覺得你非常接近你所做的嘗試。除了你必須明白,你告訴Weka要做的是捕獲2克和3克的令牌;這就是如何指定Weka_control

相反,我建議在不同的標記器中使用不同的標記大小,並根據您的偏好或決策規則選擇或合併結果。

我認爲這將是值得看看這個great tutorial n-gram wordclouds。

爲n-gram中的文本挖掘的固體代碼段是:

# QuadgramTokenizer #### 
QuadgramTokenizer <- function(x) NGramTokenizer(x, Weka_control(min = 4, max = 4) 

4-克,

# TrigramTokenizer #### 
TrigramTokenizer <- function(x) NGramTokenizer(x, Weka_control(min = 3, max = 3) 

對於3克,和當然

# BigramTokenizer #### 
BigramTokenizer <- function(x) NGramTokenizer(x, Weka_control(min = 2, max = 2) 

的爲2克。

通過像這樣分別運行不同的克大小,您可以避免以前的問題,而不是將Weka_control設置爲一個範圍。

您可以將標記生成器是這樣的:

tdm.ng <- TermDocumentMatrix(ds5.1g, control = list(tokenize = BigramTokenizer)) 
dtm.ng <- DocumentTermMatrix(ds5.1g, control = list(tokenize = BigramTokenizer)) 

如果你還有問題請你只提供reproducible例如,我會跟進。

+0

感謝Hack-R。我跑了這個片段。問題已經轉移到其他地方,而不是讓術語文檔矩陣反映4, - 3,-2克的短語,我仍然得到單個單詞。例如:'deutsche'是有效的,但是'deutche bank'(我想要被認爲是一個有效的bigram)不被識別。我的理解在哪裏? – Pradeep

+0

@Pradeep我明白了。爲了讓我能夠提供幫助,我需要一個可重複使用的示例,以便我可以在計算機上看到問題並嘗試一些方法來查看修復問題的方法。您可以使用內置或公用數據集,然後粘貼完整的代碼來重現此問題嗎? –

+0

我會發佈一個可重複的數據集。同時,我查看了[@Ben](http://stackoverflow.com/questions/16836022/findassocs-for-multiple-terms-in-r)。我認爲我可以更準確地定義我的問題:我只想要識別/指定(4-,3-,2字)的術語頻率;而不是NGram路線。這些向量作爲列存儲在術語文檔矩陣中。像 Deloitte Haskin出售 Price Waterhouse Lexis Nexis等。 – Pradeep