2012-02-02 35 views
1

我想要清理文件中的文本的最佳方式。所以我想要做的是,給定一個輸入文件,匹配相似的單詞並替換它們。因此,如果蘋果和ApPle在文件中,ApPle將被蘋果取代。有沒有辦法清理文本文件(擺脫類似的話)? (不使用嵌套for循環)

有沒有辦法做到這一點不使用兩個像這樣的循環:我總是猶豫不決,嵌套的for循環,所以我只是想知道如果有一個更優雅的解決方案使用

for $word in @file 
    for $word2 in @file 
    if $word matches $word2 
     replace $word2 with $word 
    end 
    end 
end 

。另外,如果你想知道爲什麼它是僞代碼,那是因爲我還沒決定編寫這個程序。 (對於那些不知道@file的人是一個單詞列表,$ word是一個非空白字符串)。

+0

哪裏的正則表達式來發揮作用? – krlmlr 2012-02-02 23:15:32

+0

@ user946850將「匹配」替換爲我決定使用的任何正則表達式。我並不擔心我希望它如何匹配以及如何迭代數據。 – varatis 2012-02-02 23:21:17

+0

使用正則表達式對您的示例中的兩個單詞執行一些「查找」或「替換」操作嗎?這可以作爲一個非單射散列函數肯定:-) – krlmlr 2012-02-02 23:27:03

回答

1

也許這將工作:

  • 類似詞語定義一個唯一的表示( 「散列函數」)。 (如果只是區別,那很容易,如果是相似的發音,那就更難了)

  • 在一次讀取文件時,維護一個「散列表」並且只有當它還沒有出現哈希表。

for $word in @file 
    hash=hashfunction($word) 
    if $hash not in §hashtable 
    add $hash to §hashtable 
    print $hash 
    end 
end 

如果你的散列函數不是內射的,事情會變得稍微複雜一些。

+0

是的,這更優雅。我很驚訝,我沒有想到哈希! – varatis 2012-02-02 23:14:55

0

這真的取決於「相似」對你意味着什麼,以及何時應該替換單詞。代碼應該確定這一點?你是否想將大寫的所有內容都變成小寫,或者代碼是否使用不同的標準來做到這一點?

在PHP中,你可以想見,使用(組合)以下功能: http://www.php.net/manual/en/function.str-ireplace.php(不區分大小寫替換) http://www.php.net/manual/en/function.strtolower.php(字符串轉換爲小寫) http://www.php.net/manual/en/function.strtoupper.php(字符串轉換爲大寫) http://php.net/manual/en/function.similar-text.php(怎麼看類似的字符串A是字符串B)

如果你可以發佈關於你打算用例的詳細信息,你可能會得到更好的答案:)

+0

相似性並不重要,它是比較它們的過程。如果你必須知道,這將是一個正則表達式,但這與問題無關。 – varatis 2012-02-02 23:13:43

+0

啊,我明白了。那麼,在這種情況下,這可能不是你想要的,但是對於@ user946850引發的發音問題,你可以使用PHP的metaphone或soundex(或其他語言中的等價物)。 – Daan 2012-02-02 23:14:39