2011-10-10 255 views
0

我在數據庫的臨時表中有多個條目,我需要將它們合併爲永久條目。現在這些信息來自多個XML Feeds,並且我有各種各樣的信息,但最接近的是「標題」,或者在我的情況下,即產品的名稱。 不幸的是,我沒有任何其他的方式(沒有相同的ID或類似的東西)比匹配他們的名字。 因此,例如,我有:按值排列數組

$primary = array('feedid' => 2, 'entry_name' => 'ACME Product Black Model #23'); 
$secondary = array('feedid' => 3, 'entry_name' => 'ACME Product Model #23'); 

極致的產品可能"ACME Product Model #23" to "Model 23"變化到「Black Model #23"等 此外,在相同的飼料我可能有和」 CHOAM Product Black - Model 11"

問題是,我不能只使用similar_text()levenshtein(),因爲它們有時會匹配錯誤的項目,或者有時根本不匹配。每個Feed有100多個條目,我最多可以有10個Feed。例如:「iPhone 4」和「iPhone 4 White」和「iPhone 4 Black」應該全部合併(我可以處理合並,需要先匹配)。 所以規則是 - 在這種情況下匹配電話。 它也可以是「Barby Doll White Hair」和「Barby Doll Black Hair」,但不是「其他白髮娃娃」。 ...

任何想法表示讚賞:)

+0

爲了正確匹配所有記錄,您是否容易輸入**純英文**所需的規則,因爲您更瞭解此案例。這會讓它變得更好。 – Melsi

+0

@Melsi不清楚你的英文是什麼意思。匹配的問題是,即使我不知道什麼飼料將完全匹配。我確實知道,他們都會有一個產品名稱。這個名字怎麼樣,我無法確定。我必須弄清楚如何處理這些動態數據並儘可能正確匹配。 – Norris

+0

關於此問題的一些問題:人類能夠做到這一點嗎?如果是這樣,他會使用哪種信息?鑑於你已經展示的四個例子,只要看看標題,我就不能分辨出哪些屬於一個整體。所以,如果有人能夠做到這一點,那麼這個人可能需要額外的規則,而你並沒有在這裏給出。如果一個人無法做到這一點,那麼自動完成這件事完全是不可能的。在大數據上計算機比人類更好,但對於需要理解或認知能力的任務(比如這個)則更糟糕。 – LiKao

回答

0

我認爲這是值得去與prekmatch建議。

我會是這樣的:

  1. (可選)在舊的臨時表將增加TINYINT稱爲標誌一個多場。

  2. 我會與pregmatch和pregmatch成功,我會把一個積極的標誌在舊錶上,以表明這個記錄是pregmatch成功管理。

  3. 如果pregmatch失敗,我會去與文本相似性,因爲再次建議,並會放置一個標誌,與文本相似性管理。

最後我希望很大一部分記錄可以通過pregmatch來管理,只有少數會有一個表示「文本模擬」管理的標誌。我認爲這會使問題變小。不是嗎?

如果您以後找到更好的解決方案,您可以使用此標誌來了解哪些記錄不是由pregmatch管理的。

然後至於檢索新的數據,我會去與whith文本相似性,例如像'%string%'的MySQL的東西。

至於pregmatch緩慢,你只會做這個過程一次,所以不應該是一個問題。此外,我會添加一個條件循環,以便不超過最大執行時間。

1

在評論你的寫到:

我不知道什麼飼料都將被精確匹配

那麼,如果你不能說,其他人應該怎麼告訴你?

您首先需要解決您的基本問題(從字符串獲取型號),以繼續。

除非你不能,你需要拋出異常,輸出你無法匹配的模型字符串,分析和調整你的解析器。

可以或多或少容易通過使用正則表達式解析字符串:

$r = preg_match('/Model(?: \w+)? #?(\d+)$/', $string, $matches); 
if (!$r) throw new Exception(sprintf('Unable to parse "%s"', $string)); 
$modelNumber = $matches[1]; 

這例如可與你給出的示例數據。但分析投入的工作取決於你。它不能具體回答。

+0

不會這樣工作。我無法對字符串進行正則表達式匹配。 我有100個條目,我必須匹配另外100個條目。 – Norris

+0

@Methemer:使用迭代。 – hakre

+0

@Mhehemer:Regexes實際上可能是編碼特定領域知識的一種方法。如果您知道關鍵詞,這些關鍵詞是您的模型名稱的導入字段,則可以使用正則表達式來提取它。同樣,如果你知道總是irelvant的信息,那麼正則表達式可能會幫助你擺脫這些。在你的例子中,例如,你總是可以試着放下「ACME產品」,並在「#」之後或最後獲得該號碼。這將允許更好的匹配,但你仍然會有誤報和誤報。 – LiKao