2011-06-16 52 views
0

我正在進行數據遷移,在舊系統上,用戶被允許在大文本字段中輸入他們的興趣,而沒有格式化指令。結果有些人以生物形式寫作,其他人以逗號分隔列表格式寫作。還有其他一些格式,但這些是主要格式。以編程方式確定逗號分隔列表和段落之間的差異

現在我知道如何識別逗號分隔列表(CSL)。這很簡單。但是如何確定一個字符串是否是一個CSL(可能是一個有兩個詞或短語的短詞)或者只是一段包含逗號的段落?

我以爲我有一個想法是自動忽略包含標點符號和字符串不包含逗號的字符串。不過,我擔心這還不夠,或者會有很多不足之處。所以我想詢問社區,看看你們的想法。同時我會嘗試一下我的想法。

更新: 好吧,我有我的算法。這是下面...

我的代碼:

 

//Process our interests text field and get the list of interests 
function process_interests($interests) 
{ 
    $interest_list = array(); 

    if (preg_match('/(\.)/', $interests) 0 && $word_cnt > 0) 
     $ratio = $delimiter_cnt/$word_cnt; 

    //If delimiter is found with the right ratio then we can go forward with this. 
    //Should not be any more the 5 words per delimiter (ratio = delimiter/words ... this must be at least 0.2) 
    if (!empty($delimiter) && $ratio > 0 && $ratio >= 0.2) 
    { 
     //Check for label with colon after it 
     $interests = remove_colon($interests); 

     //Now we make our array 
     $interests = explode($delimiter, $interests); 

     foreach ($interests AS $val) 
     { 
     $val = humanize($val); 

     if (!empty($val)) 
      $interest_list[] = $val; 
     } 
    } 
    } 

    return $interest_list; 
} 

//Cleans up strings a bit 
function humanize($str) 
{ 
    if (empty($str)) 
    return ''; //Lets not waste processing power on empty strings 

    $str = remove_colon($str); //We do this one more time for inline labels too. 
    $str = trim($str); //Remove unused bits 
    $str = ltrim($str, ' -'); //Remove leading dashes 
    $str = str_replace(' ', ' ', $str); //Remove double spaces, replace with single spaces 
    $str = str_replace(array(".", "(", ")", "\t"), '', $str); //Replace some unwanted junk 

    if (strtolower(substr($str, 0, 3)) == 'and') 
    $str = substr($str, 3); //Remove leading "and" from term 

    $str = ucwords(preg_replace('/[_]+/', ' ', strtolower(trim($str)))); 

    return $str; 
} 

//Check for label with colon after it and remove the label 
function remove_colon($str) 
{ 
    //Check for label with colon after it 
    if (strstr($str, ':')) 
    { 
    $str = explode(':', $str); //If we find it we must remove it 
    unset($str[0]); //To remove it we just explode it and take everything to the right of it. 
    $str = trim(implode(':', $str)); //Sometimes colons are still used elsewhere, I am going to allow this 
    } 

    return $str; 
} 
 

感謝您對您的幫助和建議!

回答

1

除了您提到的過濾之外,您還可以創建逗號與字符串長度的比率。在CSL中,這個比例往往很高,在段落低。您可以設置某種閾值,並根據條目是否具有足夠高的比例來選擇。比率接近閾值的人可能被標記爲容易出錯,然後可由主持人檢查。

+0

不是一個壞主意。我正在考慮做一個字數和設置限制,但這個想法肯定是更深入,可能更有幫助。 – pthurmond 2011-06-16 20:47:46

+0

有一點需要注意的是:「我喜歡騎自行車,滑雪,游泳和閱讀。」這將被解釋爲CSL的項目:「我喜歡騎自行車」,「滑雪」,「游泳」,「閱讀」 - 這不是預期的行爲。 – Ord 2011-06-16 21:00:23

+0

這是一個很好的觀點。我可以爲此做一個ltrim()函數調用。它會像$ interest = ltrim(trim($ interest),'and');內部修剪將用於去除可能出現在和之前的外部空白。 – pthurmond 2011-06-16 21:14:25

相關問題