請問演算法和php擴充的相關疑問

來源:互聯網
上載者:User
請教演算法和php擴充的相關疑問
本帖最後由 ShadowSniper 於 2012-11-27 23:30:22 編輯

我有個需求,想用php擴充實現:

搜尋一個字串中包含在詞表中搜尋到的詞。

比如詞表如下:
---------------



他們
你們
我們
---------------

輸入一句話:你、我與他們都是好朋友。

需求為:
1 找出包含在詞表中的詞。
2 可以通過參數控制
(1)長詞優先(找到“他們”了,就不需要再找“他”)
(2)全部返回(“他”和“他們”都找出來)
(3)只找短詞(只找“他”)
3 可以通過參數控制
(1)按詞表順序返回
(2)按詞序返回(詞在句中順序)
4 可以通過參數控制在需求3的基礎上增加個維度,正序或倒序返回


問題一:請問使用何種演算法會比較高效?
如果按詞表順序返回,那麼就漸進式掃描詞表,然後使用kmp演算法去句中取詞,這比較好辦。

如果按句中詞序返回,先用按詞表順序的方案找一遍,並且記錄下每個找到的詞在句子中的位置索引,然後再根據索引排序。
但這一步多了個排序,如何不用去排序?我一開始想到先用標準分詞,把句子分成詞,然後反著去詞表查,但有個問題很難保證,就是標準分詞我們可能要去使用第三方的,分出的詞不一定符合我們詞表中的詞的規則。因為詞表是我們人為手工錄入的。有可能會造成這種問題。詞表中有一個詞是:“屌絲”,但標準分詞法會把“屌”和“絲”當成兩個詞來分。這樣反著查就查不到了。

不知有什麼更好的方法,請指教。


問題二:詞表提體積目前大概有20000左右,不是很大。我想全部放進記憶體裡。但是使用zend提供的emalloc來申請記憶體或是使用c原生的malloc申請記憶體還是使用第三方記憶體資料庫系統?

使用emalloc申請記憶體的優點為php的記憶體管理可以幫忙管理記憶體。但缺點為需要佔用php本身的大量記憶體。
使用malloc申請記憶體的優點我不太清楚,不過貌似缺點是其也會佔用php本身的記憶體,並且很難對記憶體進行管理,因為可能會造成php本身記憶體溢出。
使用第三方記憶體資料庫的優點為不會佔用php本身的記憶體,但可能效率上會稍差一些。比如使用redis。需要在php擴充中實現對redis的串連,關閉。
------解決方案--------------------
我猜是一個php-fpm進程一次?
------解決方案--------------------
這樣的小規模應用,直接用php代碼就可實現。
給一個php代碼的測試資料
字典中共有 52938 個詞(現代漢語常用詞表en.txt)
待匹配檔案長度 19415 位元組(話說長江解說詞(刪去html成分))
匹配到詞 2300 個
耗時 146.212 毫秒
其中字典載入耗時 146.172 毫秒
折算速度 15,730 詞/秒
演算法採用 單數組trie

雖然不算很快,但已經是可以接受的了

當然寫成擴充更好,速度應該更高
既然是擴充當然就是動態連結程式庫了,載入了就駐留記憶體。所以你的第二個問題不是問題
像你這樣的應用的開發過程大致是這樣的:
1、以c/c++完成全部功能模組,配上io就是獨立軟體
2、書寫php擴充函數去調用需要暴露的介面
  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.