「智慧型問診」專案 資料匹配(1)

2021-08-10 22:00:40 字數 2402 閱讀 8547

之前在這個專案中症狀與藥品的匹配是另外乙個隊友做的,我一直沒有仔細研究,今天有時間就大概看了一下,在這裡總結一下。

首先,這個檢索過程用到了levenshtein演算法,也就是求編輯距離,先來解釋一下這個演算法的原理: 編輯

距離定義:

編輯距離,又稱

levenshtein

距離,是指兩個字串之間,由乙個轉成另乙個所需的最少編輯操作次數。

許可的編輯操作包括:將乙個字元替換成另乙個字元,插入乙個字元,刪除乙個字元。

例如將eeba轉變成abac:

eba(刪除第乙個e)

aba(將剩下的e替換成a)

abac(在末尾插入c)

所以eeba和abac的編輯距離就是3

俄羅斯科學家vladimir levenshtein在2023年提出這個概念。

演算法:演算法就是簡單的線性動態規劃(最長上公升子串行就屬於線性動態規劃)。

設我們要將s1變成s2

定義狀態矩陣edit[len1][len2],len1和len2分別是要比較的字串s1和字串s2的長度+1(+1是考慮到動歸中,乙個串為空的情況)

然後,定義edit[i][j]是s1中前i個字元組成的串,和s2中前j個字元組成的串的編輯距離

具體思想是,對於每個i,j從0開始依次遞增,對於每一次j++,由於前j-1個字元跟i的編輯距離已經求出,所以只用考慮新加進來的第j個字元即可

插入操作:在s1的前i個字元後插入乙個字元ch,使得ch等於新加入的s2[j]。於是插入字元ch的編輯距離就是edit[i][j-1]+1

刪除操作:刪除s1[i],以期望s1[i-1]能與s2[j]匹配(如果s1[i-1]前邊的幾個字元能與s2[j]前邊的幾個字元有較好的匹配,那麼這麼做就能得到更好的結果)。另外,對於s1[i-1]之前的字元跟s2[j]匹配的情況,edit[i-1][j]中已經考慮過。於是刪除字元ch的編輯距離就是edit[i-1][j]+1

替換操作:期望s1[i]與s2[j]匹配,或者將s1[i]替換成s2[j]後匹配。於是替換操作的編輯距離就是edit[i-1][j-1]+f(i,j)。其中,當s1[i]==s2[j]時,f(i,j)為0;反之為1

於是動態規劃公式如下:

python實現:

官方擴充套件包:

python有乙個官方擴充套件包(在pypi裡面,即python package index),叫做python-levenshtein,這個包不僅可以計算編輯距離,還能計算hamming(漢明)距離,jaro-winkler距離等,鏈結如下:

python setup.py build

python setup.py install

即可。注意:如果沒有安裝setuptools的話要先安裝setuptools,鏈結如下:

python setup.py build

python setup.py install

即可。檢查是否安裝成功:進入python,執行from levenshtein import *,如果沒有報錯則安裝成功

具體使用方法見如下博文(這邊博文下方還有完整的使用文件的連線):

注意:如果採用from levenshtein import *匯入,則呼叫函式的時候不用加levenshtein.

例如:直接呼叫distance(str1, str2)即可計算編輯距離

簡單的實現**:

如果你想要更加輕量級的實現的話,就用下面的**吧:

(選自邊蘇濤的部落格,

而在我們的專案中的實現方法是這樣的

#key[1] = u"腎性高血壓"

#key[2] = u"心功能不全"

#key[3] = u"充血性心力衰竭"

#key[4] = u"高血壓病"

#key[5] = u"高血脂"

weight1 = 2.0

weight2 = 1.75

weight3 = 1.5

weight4 = 1.25

weight5 = 1.0

diseaseweight = 1.0

symptomweight = 0.8

drugweight = 0.6

colsweight = [diseaseweight, symptomweight, drugweight]

ansnum = 10

self.matchkeywords(path, keys, keysweight, colsweight, ansnum) #計算levenshtein距離

總而言之,還是將兩個字串進行比較,求出將乙個字串變為另乙個所需要的最小操作次數,但是這種做法還是比較基本的字串匹配,也就是「文字相似度」,對於近義詞,尤其是藥品與症狀的對應關係可能並不能很好的解決,這可能也是導致模型效果不理想的原因,接下來在這方面可以做一些優化,比如研究一下tf-idf之類的演算法

參考資料:

專案資料收集

專案資料收集是在簽約產品之後為後續發行工作做的一系列準備之一。專案組必須擁有足夠多的專案物料,才能展開很多後續工作。提供最新的體驗包,方便專案參與人員深入體驗。策劃文件的獲取給產品提供調優思路,也可以參考資源流向來制定運營活動,同時有助於了解遊戲。收集產品美術素材,我們的設計會根據這些素材來設計美宣...

gitlab專案資料同步

功能要求 在公網上搭建乙個gitlab伺服器,所有專案 的更新 提交都在這個伺服器的專案中進行,實現對 的版本控制。同時,在本地的區域網內再搭建乙個gitlab伺服器,把專案中每天的 變化同步到這個伺服器的專案中,進行備份。思路 公網上gitlab伺服器是專案 提交更新的地方,區域網內的gitlab...

實習專案資料互動

前記 在專案開發時,前後端是分開的且在同乙個區域網內,當需要聯合測試時,以區域網中第三台伺服器的centos系統配置nginx監聽前後端指定埠實現訪問。專案測試完就可以到生產環境部署了。root使用者才有put 許可權,其他使用者需要開放。python安裝virtualenv是在scripy中安裝v...