2010-01-24 128 views
3

我正在開發輔助和替代通信(AAC)程序。我目前的目標是存儲輸入/說出文本的歷史記錄,並搜索常用短語片段或單詞n-gram。我正在使用基於lzw壓縮算法的實現,如CodeProject - N-gram and Fast Pattern Extraction Algorithm所述。儘管生成n-gram,但這種方法並不按照需要運行。正則表達式使用正則表達式

比方說,我多次進入「在山上和樹林中」。我期望的輸出將是整個短語「在山上和樹林中」。使用我目前的實現,該短語被分解爲三元組,並且在每個重複條目上添加一個詞。因此,在第一個入口我得到「過山」。在第二項「過山」等

假設我們有以下文字:

這是一個測試
這是另一個測試
這也是考驗
緊急廣播系統的測試中斷了我最喜歡的歌曲

我的目標是,如果「這是對緊急廣播系統的測試」進入下一個我可以讓我們e在正則表達式內返回「這是一個測試」和「緊急廣播系統的測試」。這是可能通過正則表達式或我走錯了路嗎?我感謝任何幫助。

+3

正則表達式是錯誤的工具。 – 2010-01-24 21:26:19

回答

0

從你的用例看來,你不想要固定長度的n-gram匹配,而是一個最長的n-gram匹配序列。剛剛看到你自己的帖子的答案,這證實了;)

0

在python中,你可以使用fuzzywuzzy庫通過「同義詞」短語或單詞的關聯列表匹配一組短語到規範/規範化的短語集。訣竅是恰當地分段你的短語(例如,當逗號分開短語以及它們何時加入短語中的相關單詞列表時)?

下面是RAM中python字典的結構。在C本數據結構或數據庫將是類似的:

phrase_dict = { 
    'alternative phrase': 'canonical phrase', 
    'alternative two': 'canonical phrase', 
    'less common phrasing': 'different canonical phrase', 
    } 

from fuzzywuzzy.process import extractOne 

phrase_dict[extractOne('unknown phrase', phrase_dict)[0]] 

,並返回

'canonical phrase' 

FuzzyWuzzy似乎使用類似的簡化的Levenshtein編輯距離......這是快,但不處理好大寫字母(首先對你的情況進行標準化處理),單詞聲音(還有其他庫,如soundex,它們可以用他們聽起來像是散列的短語)或單詞含義(這就是你的短語詞典的用途)。