2014-12-03 67 views
0

我有一個文本文件的目錄。我想遍歷目錄中的每個文本文件,並獲取唯一字詞的總數(詞彙計數),而不是針對每個文件,而是針對所有文件。換句話說,我希望所有文件中的唯一字的數量一起,而不是每個單獨文件的唯一字數。如何從PHP中的文本文件目錄中獲取唯一字詞的計數?

例如,我在一個目錄中有三個文本文件。這裏是他們的內容:

file1.txt - >這裏是一些文字。

file2.txt - >這裏是更多的文字。

file3.txt - >甚至更多的文字。

所以該目錄的文本文件在這種情況下獨特單詞數爲6

我曾嘗試使用此代碼:

$files = glob("C:\\wamp\\dir"); 

$out = fopen("mergedFiles.txt", "w"); 


    foreach($files as $file){ 
     $in = fopen($file, "r"); 
     while ($line = fread($in)){ 
      fwrite($out, $line); 
     } 
     fclose($in); 
    } 


    fclose($out); 

合併所有的文本文件,然後後使用這段代碼我打算在mergedFiles.txt上使用array_unique()。但是,代碼不起作用。

如何以最佳方式獲取目錄中所有文本文件的唯一字數?

+0

'但是,代碼不working'它究竟如何不工作? – 2014-12-03 08:15:51

+0

我不認爲你需要將所有的文本合併在一起,才能連續打開文件。閱讀每一行,刪除標點符號並標準化案例。拆分成單詞並添加到一個集合中,或者作爲關鍵字(而不是數值)添加到存儲該值中該單詞的計數的關聯數組中。最後,數組/集合的大小是唯一字的數量。 – 2014-12-03 08:17:25

回答

1

你可以試試這個:

$allWords = array(); 

foreach (glob("*.txt") as $filename) // loop on each file 
{ 
    $contents = file_get_contents($filename); // Get file contents 
    $words = explode(' ', $contents); // Make an array with words 

    if ($words) 
     $allWords = array_merge($allWords, $words); // combine global words array and file words array 
} 

var_dump(count(array_unique($allWords))); 

編輯其他版本,其中:

  • 刪除點
  • 刪除多個空格
  • 匹配字if語句的結束之間缺少空間新的一個。

function removeDot($string) { 
    return rtrim($string, '.'); 
} 

$words = explode(' ', preg_replace('#\.([a-zA-Z])#', '. $1', preg_replace('/\s+/', ' ',$contents))); 
$words = array_map("removeDot", $words); 
+0

這是一種矯枉過正的行爲,並不是所有的單詞都會在一個空間上爆炸。句子結尾的單詞怎麼樣? – 2014-12-03 08:19:47

+0

@Hanky웃Panky:最後一句話也會爆炸。 '爆炸('','這裏是一些文字')'將返回4個單詞。 – djidi 2014-12-03 08:22:14

+0

這只是一個句子。 https://eval.in/229773怎麼樣,甚至在你提到的情況下,你是說'text.'是一個詞? nope'text'是;沒有一段時間。 – 2014-12-03 08:25:32

相關問題