程式碼如下:
<code><?php /** * 任一个英文的纯文本文件,统计其中的单词出现的个数。 * Created by PhpStorm. * User: Paul * Date: 2016/11/5 * Time: 23:18 */ $content = file_get_contents('4/Gone with the wind.txt'); $res = count_word($content, 1); print_r($res); /** * 任一个英文的纯文本文件,统计其中的单词出现的个数。 * @param string $string 字符串 * @param int $lower 是否大小写 1:不区分大小写 0:区分大小写 * @return array */ function count_word($string, $lower = 0) { $string = trim($string); if ($lower) { $string = strtolower($string); } //过滤掉一些标点符号 $string = str_replace(';', '', $string); $string = str_replace(',', '', $string); $string = str_replace('.', '', $string); $string = str_replace('.', '', $string); $string = str_replace('‘', '', $string); $string = str_replace('?', '', $string); $string = str_replace('“', '', $string); $string = str_replace('”', '', $string); $string = str_replace('―', '', $string); $string = str_replace('-', '', $string); $string = str_replace('!', '', $string); $string = str_replace(':', '', $string); $string = str_replace('(', '', $string); $string = str_replace(')', '', $string); $array = explode(' ', trim($string)); $res = array(); foreach ($array as $key=>$value) { //过滤掉如I’ll、you’re、masters’s等单词 if (strpos($value, '’') !== false || strpos($value, "'") !== false) { continue; } //过滤掉空 if (empty($value) === true) { continue; } if (array_key_exists($value, $res)) { $res[$value]++; } else { $res[$value] = 1; } } //排序 array_multisort($res, SORT_DESC, SORT_NUMERIC); return $res; }</code>
輸出結果:
<code>array( [repression] => 1 [thoroughness] => 1 [bleached] => 1 [tow] => 1 [inspired] => 1 [uniformwell] => 1 [panamas] => 1 [caps when] => 1 )</code>
不明白為什麼會把兩個單字給判斷成一個單詞,txt呢是用sublime打開並且設置編碼為UTF-8,沒有用電腦自帶的文本文檔工具打開編輯過,另外呢,過濾標點符號的時候也有加上過濾掉rn來處理,但沒效果,所以程式碼去掉了。求解為什麼會出現這種情況並且如何避免?
程式碼如下:
<code><?php /** * 任一个英文的纯文本文件,统计其中的单词出现的个数。 * Created by PhpStorm. * User: Paul * Date: 2016/11/5 * Time: 23:18 */ $content = file_get_contents('4/Gone with the wind.txt'); $res = count_word($content, 1); print_r($res); /** * 任一个英文的纯文本文件,统计其中的单词出现的个数。 * @param string $string 字符串 * @param int $lower 是否大小写 1:不区分大小写 0:区分大小写 * @return array */ function count_word($string, $lower = 0) { $string = trim($string); if ($lower) { $string = strtolower($string); } //过滤掉一些标点符号 $string = str_replace(';', '', $string); $string = str_replace(',', '', $string); $string = str_replace('.', '', $string); $string = str_replace('.', '', $string); $string = str_replace('‘', '', $string); $string = str_replace('?', '', $string); $string = str_replace('“', '', $string); $string = str_replace('”', '', $string); $string = str_replace('―', '', $string); $string = str_replace('-', '', $string); $string = str_replace('!', '', $string); $string = str_replace(':', '', $string); $string = str_replace('(', '', $string); $string = str_replace(')', '', $string); $array = explode(' ', trim($string)); $res = array(); foreach ($array as $key=>$value) { //过滤掉如I’ll、you’re、masters’s等单词 if (strpos($value, '’') !== false || strpos($value, "'") !== false) { continue; } //过滤掉空 if (empty($value) === true) { continue; } if (array_key_exists($value, $res)) { $res[$value]++; } else { $res[$value] = 1; } } //排序 array_multisort($res, SORT_DESC, SORT_NUMERIC); return $res; }</code>
輸出結果:
<code>array( [repression] => 1 [thoroughness] => 1 [bleached] => 1 [tow] => 1 [inspired] => 1 [uniformwell] => 1 [panamas] => 1 [caps when] => 1 )</code>
不明白為什麼會把兩個單字給判斷成一個單詞,txt呢是用sublime打開並且設置編碼為UTF-8,沒有用電腦自帶的文本文檔工具打開編輯過,另外呢,過濾標點符號的時候也有加上過濾掉rn來處理,但沒效果,所以程式碼去掉了。求解為什麼會出現這種情況並且如何避免?
你的問題應該就出在沒有處理換行(和回車)以及那些過濾字符被替換成了'', 應該替換成' '
<code class="php"><?php $content = file_get_contents(__FILE__); //没有你的原始文本, 所以就直接读取文件自身作为样本了 $res = count_word($content, 1); print_r($res); /** * 任一个英文的纯文本文件,统计其中的单词出现的个数。 * @param string $string 字符串 * @param int $lower 是否大小写 1:不区分大小写 0:区分大小写 * @return array */ function count_word($string, $lower = 0) { $string = trim($string); if ($lower) { $string = strtolower($string); } //过滤掉一些标点符号 $string = str_replace([';',',','.','.','‘','?','“','”','―','-','!',':','(',')',"\r","\n"], ' ', $string); $array = explode(' ', $string); $res = array(); foreach ($array as $key=>$value) { //过滤掉空 if (!$value) { continue; } //过滤掉如I’ll、you’re、masters’s等单词 if (strpos($value, '’') !== false || strpos($value, "'") !== false) { continue; } if (array_key_exists($value, $res)) { $res[$value]++; } else { $res[$value] = 1; } } //排序 array_multisort($res, SORT_DESC, SORT_NUMERIC); return $res; }</code>
不知道你的檔案裡的字串是什麼樣子的,不過trim
函數只會去掉兩邊的空格(rn
),感覺問題會出在這裡。