葛成鵬,鄒 其,王翊同,李鴻強(qiáng)
(河北建筑工程學(xué)院 數(shù)理系,河北 張家口 075000)
農(nóng)藥是重要的農(nóng)業(yè)生產(chǎn)資料,農(nóng)藥的生產(chǎn)、經(jīng)營和使用與保障農(nóng)產(chǎn)品的有效供給、農(nóng)業(yè)生產(chǎn)穩(wěn)定發(fā)展息息相關(guān)。但是,農(nóng)藥也是一把雙刃劍,過分依賴化學(xué)農(nóng)藥,以及農(nóng)藥的不科學(xué)使用等也帶來了農(nóng)業(yè)面源污染、生態(tài)環(huán)境破壞及農(nóng)產(chǎn)品質(zhì)量安全等一系列問題。加強(qiáng)農(nóng)藥管理以及農(nóng)藥知識科普宣傳,對于實(shí)施鄉(xiāng)村振興戰(zhàn)略,促進(jìn)質(zhì)量興農(nóng)、綠色興農(nóng)意義重大。
從農(nóng)藥專業(yè)人員到農(nóng)藥使用者,農(nóng)藥知識科普渠道不暢,隨著計(jì)算機(jī)技術(shù)的發(fā)展,通過農(nóng)業(yè)信息化,研發(fā)一款將農(nóng)藥使用者與農(nóng)藥專業(yè)人員聯(lián)系起來的農(nóng)藥手機(jī)應(yīng)用程序?qū)⑹且患幸饬x的興農(nóng)舉措,可打通農(nóng)藥知識科普渠道,提高農(nóng)藥知識科普效率,方便農(nóng)民科學(xué)、合理、安全、高效使用農(nóng)藥,從而推動農(nóng)業(yè)增產(chǎn)、農(nóng)民增收及農(nóng)村人居環(huán)境整治。
本研究開發(fā)一款致力于幫助農(nóng)藥的使用人員和專業(yè)人員之間互相溝通的APP,結(jié)合MySQL數(shù)據(jù)庫[1],使用人員不僅可以查詢到自己需要的科普信息,而且能夠與專業(yè)人員進(jìn)行實(shí)時交流,及時地針對性地解決問題。
農(nóng)藥科普APP設(shè)有2種角色,分別為農(nóng)藥的使用人員和專業(yè)人員,他們有不同的功能和權(quán)限。
農(nóng)藥的使用人員:注冊和登錄、查詢科普信息、人機(jī)對話、與專業(yè)人員實(shí)時交流。農(nóng)藥使用人員功能圖如圖1所示。
圖1 農(nóng)藥使用人員功能圖 圖2 農(nóng)藥專業(yè)人員功能圖
農(nóng)藥專業(yè)人員:注冊和登錄、發(fā)布科普信息、對使用人員進(jìn)行指導(dǎo)。農(nóng)藥專業(yè)人員功能圖如圖2所示。
具體使用流程如下:用戶登錄進(jìn)APP時,可以正常地瀏覽APP里的農(nóng)藥科普信息,使用人員和專業(yè)人員之間可以進(jìn)行問題解答,以及發(fā)布最新的新聞信息。當(dāng)用戶想發(fā)布問題或解決問題時,如果沒有登錄會自動跳越到登錄注冊頁面,用戶在注冊時區(qū)分使用人員和專業(yè)人員。當(dāng)用戶點(diǎn)擊搜索按鈕時,會跳出一些農(nóng)藥推薦,是一段時間內(nèi)搜索最多的一批農(nóng)藥科普信息。
PHP的選項(xiàng)與其語法一樣,具有很高的靈活性。使用PHP,可以在只有shell用戶權(quán)限的環(huán)境下創(chuàng)建完善的服務(wù)器端程序,或者在被嚴(yán)格限制環(huán)境下使用它來完成服務(wù)器端包含(Server-Side Includes)而無需承擔(dān)太大的風(fēng)險。所以在本研究里,PHP用于服務(wù)器端的編寫,安全性高。
1.3.1 農(nóng)藥知識搜索模塊
農(nóng)藥知識搜索模塊是該APP必備的模塊。用戶在搜索欄里輸入要搜索農(nóng)藥的名稱,通過模糊匹配算法將用戶所要查詢的內(nèi)容呈現(xiàn)給用戶。在字符串比對上,首先想到的是KPM算法,但原生的KPM算法只能判斷兩個字符串的包含關(guān)系,但“匹配度”并不是用是否包含來表示,比如“are”與“abrce”,雖然有包含關(guān)系但并不匹配。因此,匹配度由兩個字符串的最長公共子序列來比對更準(zhǔn)確。
在計(jì)算匹配度前,我們需要先去除里面的冗余信息,提高其匹配的準(zhǔn)確度,比如“安徽昊源尿素”中,“安徽昊源”就是冗余信息,我們只需要比對“尿素”即可。因此在比對前對于一些常見的冗余信息,應(yīng)去除掉。我們可以將一些冗余信息放在redundances中,將str里的冗余信息提前去除。去除冗余信息的代碼如下:
StringBuilder stringBuilder = new StringBuilder(str);
for (String redundance : redundances) {
int index = stringBuilder.indexOf(redundance);
if (index != -1) stringBuilder.replace(index, index+redundance.length(), "");
}
return stringBuilder.toString();
在提前去除掉一些冗余信息后,我們還需要對閾值的設(shè)置進(jìn)行支持。重合率高過閾值時我們就可以認(rèn)定為兩個字符串匹配,指向同一個農(nóng)藥。閾值設(shè)置的代碼如下:
double sa = coincidenceRate(str1, str2, length);
return sa >= threshold;
具體操作過程如下:用戶進(jìn)入APP首頁,點(diǎn)擊最上方的搜索欄,在里面輸入要搜索的農(nóng)藥名稱,然后點(diǎn)擊搜索按鈕,頁面會跳轉(zhuǎn)到一個單獨(dú)的頁面,里面顯示相匹配的農(nóng)藥知識。在開發(fā)程序里的com.our.nyxx包里的SearchKnowledgeListActivity.java中為搜索按鈕添加監(jiān)聽事件,當(dāng)監(jiān)聽事件被觸發(fā)時,調(diào)用里面的Onclick方法,獲取輸入的內(nèi)容,以其為根據(jù)從服務(wù)器端獲取與之匹配的農(nóng)藥知識,然后跳轉(zhuǎn)頁面,通過initdata方法將他們顯示到頁面上。搜索模塊運(yùn)行界面如圖3所示。
圖3 搜索模塊運(yùn)行界面
1.3.2 搜索農(nóng)藥推薦模塊
農(nóng)藥推薦模塊通過用戶搜索農(nóng)藥來進(jìn)行反饋,這不僅能方便用戶查看農(nóng)藥信息,而且能夠反映今年病蟲害情況,便于來年及時防治。要提高APP推薦結(jié)果的質(zhì)量,就必須采集大量的用戶搜索農(nóng)藥記錄。利用三元組集合表示用戶搜索農(nóng)藥記錄,主要步驟如下:①收集用戶搜索的農(nóng)藥數(shù)據(jù);②統(tǒng)計(jì)被搜索次數(shù)最多的農(nóng)藥;③針對具體的使用人員,根據(jù)搜索的農(nóng)藥標(biāo)簽找到最匹配的農(nóng)藥推送給使用人員。
設(shè)P(a,i)為用戶a對農(nóng)藥i的標(biāo)記,則有:
(1)
其中:na,b為用戶a搜索標(biāo)簽b的次數(shù),nb,i為農(nóng)藥i被搜索為標(biāo)簽b的次數(shù)。
但隨著搜索次數(shù)的增加,熱門標(biāo)簽的權(quán)重值會發(fā)生改變,影響APP推薦的結(jié)果。因此采用一些算法對其進(jìn)一步改進(jìn),找到IDF(逆文本頻率指數(shù))值低的標(biāo)簽降低其所占權(quán)重:
(2)
推薦系統(tǒng)中最重要的就是相似度計(jì)算,本文運(yùn)用皮爾遜相關(guān)系數(shù)公式來表示兩個變量X和Y間的協(xié)方差和標(biāo)準(zhǔn)差的商,即推薦結(jié)果和用戶預(yù)期的相關(guān)性。皮爾遜相關(guān)系數(shù)為:
(3)
r>0為正相關(guān),r<0為負(fù)相關(guān),r越大表示線性相關(guān)程度越強(qiáng)[5]。
1.3.3 在線指導(dǎo)模塊
使用人員進(jìn)入在線指導(dǎo)界面,點(diǎn)擊發(fā)布留言,通過開發(fā)程序k writewordsActivity.java里的上傳存儲sendwords方法將所要發(fā)布的內(nèi)容存儲進(jìn)數(shù)據(jù)庫,再通過呈現(xiàn)initview方法將里面的內(nèi)容呈現(xiàn)到APP里的指導(dǎo)模塊下。專業(yè)人員可以通過點(diǎn)擊問題下的評論按鈕,對其進(jìn)行解答。在線指導(dǎo)運(yùn)行界面如圖4所示。
圖4 在線指導(dǎo)運(yùn)行界面
本文對農(nóng)藥科普APP進(jìn)行了詳細(xì)的需求分析,闡述了該APP的設(shè)計(jì)與開發(fā)流程,著重介紹了3個核心模塊的實(shí)現(xiàn)方法。這樣的APP的出現(xiàn)能夠很好地幫助農(nóng)藥使用人員防治病蟲害,對農(nóng)業(yè)的貢獻(xiàn)不可小覷,具有一定的實(shí)用價值。