2017-10-18 85 views
1

我在使用Mallet 2.0.7在Java中用於挖掘鳴叫。 根據文檔,對於主題建模,我必須使用CsvIterator讀取數據集。創建自定義模式爲我的數據集在槌

Reader fileReader = new InputStreamReader(new FileInputStream(new File(args[0])), "UTF-8"); 
    instances.addThruPipe(new CsvIterator (fileReader, Pattern.compile("^(\\S*)[\\s,]*(\\S*)[\\s,]*(.*)$"), 
              3, 2, 1)); // data, label, name fields 

我的數據集是這樣的:行,X,位置,用戶名,hashtaghs,文本,轉推,日期,收藏夾,numberOfComment

的標籤我加x列。在第一次,我想在列文本(6)中運行算法,後來又添加了另一列。我編寫了這種模式,但它不能正確工作,它直到最後才獲得第6列的數據。如何更改模式的正則表達式?

Reader fileReader = new InputStreamReader(new FileInputStream(new File(filePath)), "UTF-8"); 
    instances.addThruPipe(new CsvIterator(fileReader, 
      Pattern.compile("^(\\S*)[\\s,]*(\\S*)[\\s,]*(\\S*)[\\s,]*(\\S*)[\\s,]*(\\S*)[\\s,]*(.*)$"), 
      6, 2, 1)); // data, label, name fields 

回答

1

尋找正則表達式文檔來理解模式中每個元素的含義。原始圖案將整行分爲三組:從開頭到第一個逗號或空白的所有字符,直到第二個逗號或空白的所有字符,然後是其他所有字符。

新模式也是一樣的,但卻捕獲了六組。這就是爲什麼你要從文本到行結束的所有內容。

我會建議一些修正:

  • 如果字段是不相關的,像label,你可以用0來指定,它不存在。您不需要添加虛擬字段。

  • ()中的任何內容都是捕獲組。如果您不想包含字段,請不要捕獲它。只需刪除括號但離開模式。

  • 原始模式的工作原理是因爲我們可以對名稱和標籤字段進行假設:它們不包含調頻或空格,並且之後的所有內容都是文本。要搶在一條線的中間的領域,你需要更加小心。你必須找到文本字段的末尾。我強烈建議使用製表符分隔的字段,假設沒有字段包含製表符。

嘗試這樣的事情(測試):

// row,x,location,username,hashtaghs,text,retweets,date,favorites,numberOfComment 
Reader fileReader = new InputStreamReader(new FileInputStream(new File(filePath)), "UTF-8"); 
instances.addThruPipe(new CsvIterator(fileReader, 
     Pattern.compile("^(\d+)\t[^\t]*\t[^\t]*\t[^\t]*\t([^\t]*)\t[^\t]*\t[^\t]*\t[^\t]*\t[^\t]*$"), 
     2, 0, 1)); // data, label, name fields 
+0

感謝您的回答!我想函數編譯(數據組)的參數3是我想要在其中檢測主題的文本的索引,爲此,我通過了6。你傳遞了2這意味着在我的數據集中,這意味着2列(文本和轉推)? – NASRIN

+0

在我的預處理步驟中,我刪除了逗號,停用詞和派生推文。因爲這個原因,我用逗號作爲分隔符,我根據你的指導改變了模式。 「^(\\ d +)[,] * [^,] * [,] * [^,] * [,] * [^,] * [,] *([^,] *)[,] * [ ^,] * [,] * [^,] * [,] * [^,] * [,] * [^,] * $「但是我仍然懷疑我的程序,你有沒有槌子的例子,除了郵件木槌網站? – NASRIN

相關問題