2015-01-13 41 views
4

我正在使用槌子主題建模示例代碼,雖然它運行良好,我想知道這個聲明的參數實際上是什麼意思?在Mallet中,csvIterator的參數是什麼意思?

instances.addThruPipe(new CsvIterator(new FileReader(dataFile), 
             "(\\w+)\\s+(\\w+)\\s+(.*)", 
             3, 2, 1) // (data, target, name) field indices      
        ); 

回答

7

documentation

這個迭代器,也許更恰當地稱爲線條圖案迭代器,通過讀取一個文件,並返回每行一個實例,基於正則表達式。

如果你有表格的數據

[名] [標籤] [數據]

您感興趣的調用是

CsvIterator(java.io.Reader input, java.lang.String lineRegex, 
      int dataGroup, int targetGroup, int uriGroup) 

第一個參數是如何將數據被讀入,就像文件讀取器或字符串讀取器一樣。第二個參數是用於從讀取器讀取每行數據的正則表達式。在你的榜樣,你有(\\w+)\\s+(\\w+)\\s+(.*)翻譯爲:

  • 1個或多個字母數字字符(捕獲組,這是實例的名稱),其次是
  • 1個或多個空白字符(標籤,空間,..),隨後
  • 1或多個字母數字字符(捕獲基團,這是標籤/目標),隨後
  • 1個或多個空白字符(製表符,空間,..),隨後
  • 0個或更多字符(這是數據)

數字3, 2, 1表示數據最後出現,目標排在第二位,名稱先出現。正則表達式基本上確保每一行的格式如文檔中所述:

test1 spam Wanna buy viagra? 
test2 not-spam Hello, are you busy on Sunday? 

CsvIterator是一種可怕的名稱,因爲它實際上不是逗號分隔的這個類讀取值,它是由空格隔開(空間,標籤,...)值。

+0

極好的解釋! –

+0

這是一個很好的解釋。它是否像One-vs-Rest類型的分類器一樣支持多個標籤? – brianray

0

上面的答案給出的解釋太好了。

但是有一點缺失。正則表達式(正則表達式)對於每行數據,標籤和Line正則表達式中的輸入實例的名稱字段需要與輸入文件中提供的實例方式相對應,即如果假設您要提供名稱作爲第一個字段,則數據作爲第二個字段,並將其標記爲輸入文件中的第三個字段,那麼您必須先提供名稱的正則表達式,然後再提供數據的正則表達式,然後再提供標籤的正則表達式。示例如下所示:

輸入實例:Mail67(選項卡空間)TCC問題。您好,出於某種原因,舊大師畫部門的管理人員無法從TCC獲取信息。它似乎正在通過JDE,但在TCC搜索時沒有出現。任何幫助或指導,你可以提供給f ....(標籤空間)公司

CsvIterator參數:CsvIterator(新FileReader(文件路徑),「(\ w +)\ t(。*)\ t(\ w +)「,2,3,1)

相關問題