2014-12-27 54 views
1

我正在嘗試在項目中使用MALLET機器學習庫來進行詞義消歧。我的特徵向量包含一個x令牌的固定大小的令牌窗口,位於目標令牌的左側和右側。槌訓練實例被創建這樣的:使用Mallet進行樸素貝葉斯分類:Alphabets如何以及在哪裏設置?

// Create training list 
Pipe pipe = new TokenSequenceLowercase(); 
InstanceList instanceList = new InstanceList(pipe); 
Instance trainingInstance = new Instance(data, senseID, instanceID, text); 
instanceList.add(trainingInstance); 
... 
// Training 
ClassifierTrainer classifierTrainer = new NaiveBayesTrainer(); 
Classifier classifier = classifierTrainer.train(trainingList); 

其中

  • 「數據」是一個ArrayList <字符串>與特徵令牌
  • 「senseID」是相應單詞的類別標籤意義
  • 「instanceID」只是一個字符串來標識訓練實例
  • 「text」是原始源文本

我會期望InstanceList的dataAlphabet和targetAlphabet屬性是隨着訓練實例的添加而建立的,但事實並非如此。因此,由於NB教練的targetAlphabet屬性爲NULL,因此我的代碼在NPE的最後一行中失敗。

查看MALLET代碼(感謝開源),我可以看到非字符串構造的根本原因是我的數據和標籤沒有實現AlphabetCarrying接口。因此,返回NULL在這裏的實例類:

​​

我覺得這相當混亂,因爲文檔中說,數據和標籤可以是任何對象類型。但是,上面的這個錯誤似乎表明相反,我需要構造一個實現AlphabetCarrying的特定數據/標籤類。

我覺得我是錯過了關於這些字母在概念層面上的重要東西。另外,我不清楚,如果數據字母表應該來自所有的訓練實例或只有一個。 有人可以在這裏解釋錯誤嗎?

乾杯,

馬丁

回答

4

這裏回答我的問題:解決的辦法是增加一些管道,特別是TokenSequence2FeatureSequence管構建數據字母和Target2Label建立標籤字母。另外,訓練實例需要使用instanceList.addThruPipe(trainingInstance)添加。

這是基於Mallet郵件列表的答案。

+0

您可能遇到的問題是導入本指南應該幫助的數據:http://mallet.cs.umass.edu/import-devel.php –