問答系統(三) 問題模組

2021-09-27 06:51:30 字數 3335 閱讀 8607

功能分析:

1、提出的問題需要進行敏感詞過濾:問題不是是一些不正當言論或其他的***

2、提出的問題可能有很多,需要進行乙個分頁展示

一、model

public class question
二、dao:基本的crud

例如:這種需要做判斷的,查出當前使用者的10條問題或者查出顯示在主頁的10條問題

@select("")

public inte***ce questiondao ,#,#,#,#)"})

int addquestion(question question);

@select("")

listselectlatestquestions(@param("userid") int userid, @param("offset") int offset,

@param("limit") int limit);

@select("})

question getbyid(int id);

@update( where id=#"})

int updatecommentcount(@param("id") int id, @param("commentcount") int commentcount);

}

三、service:除了基本的業務,主要是標籤和敏感詞過濾

public class questionservice 

public int addquestion(question question)

public listgetlatestquestions(int userid, int offset, int limit)

public int updatecommentcount(int id, int count)

}

1、標籤過濾:使用了spring提供的工具htmlutils過濾標籤

2、敏感詞過濾:使用了字首樹

(1)、我們需要乙個sensitivewords.txt ,裡面放置了我們自定義的敏感詞

(2)、建立乙個字首樹,把敏感詞放進樹中,作為樹的節點

(3)、取出問題的標題和內容的內容,進行判斷。如果是敏感詞就替換為我們指定的字元:***,***

(4)、我們在類實現initializingbean介面,initializingbean介面為bean提供了初始化方法的方式, 它只包括afterpropertiesset方法,凡是繼承該介面的類,在初始化bean的時候都會執行該方法。我們把sensitivewords.txt的讀取和初始化樹節點的邏輯放在這裡,這樣優化使用者體驗。

演算法實現:三個指標,指向樹的根節點a,字串的第乙個b和字串的第乙個c

1、把b與a比較,判斷是不是敏感詞節點,是,c不動,b、a移動;繼續比較

2、 不是敏感詞的下一節點,把c加入字元陣列,c,b,a移動

public class sensitiveservice implements initializingbean 

//獲取節點

trienode getsubnode(character key)

boolean iskeywordend()

void setkeywordend(boolean end)

public int getsubnodecount()

}private trienode rootnode = new trienode();

//判斷這個字元是否為數字或東亞文字,如果既不是數字又不是東亞文字,那就是一些其他符號,也要過濾到

private boolean issymbol(char c)

//增加字元進樹的方法

private void addword(string linetxt)

//拿到這個字元對應節點

trienode node = tempnode.getsubnode(c);

//沒有這個節點,就構造乙個,並且存入資料

if (node == null)

//節點移動到當前節點位置

tempnode = node;

if (i == linetxt.length() - 1) }}

//初始化字典樹

@override

public void afterpropertiesset() throws exception

read.close();

} catch (exception e)

}/**

* 過濾敏感詞

*/public string filter(string text)

string replacement = default_replacement;

//使用乙個stringbuilder來儲存結果

stringbuilder result = new stringbuilder();

trienode tempnode = rootnode;

int begin = 0; // 回滾數

int position = 0; // 當前比較的位置

while (position < text.length())

++position;

continue;

}tempnode = tempnode.getsubnode(c);

// 當前位置的匹配結束

if (tempnode == null) else if (tempnode.iskeywordend()) else

}return result.tostring();

}}

四、controller

@responsebody

public string addquestion(@requestparam("title") string title, @requestparam("content") string content) else

if (questionservice.addquestion(question) > 0)

} catch (exception e)

return wendautil.getjsonstring(1, "失敗");

}對於這個字典樹的:理解好演算法,其他都不難。實際就是字串的移動,樹結構也就是乙個map。

問答系統調研

大型qa系統大多數是基於web資訊檢索的,各級nlp技術比如句法分析,ner,ir ie等都會涉及。還有一種是基於knowledge base的,將自然問句形式化成query,到知識庫裡檢索答案。如果想自己做乙個簡單系統的話可以先選擇乙個特定領域比如醫療qa,到網上抓取資料,用語義網rdf owl構...

PyAiml問答系統構建

pyaiml問答系統在使用過程中有一下問題 1.匹配的時候 只能代表乙個字元以及乙個字元以上,而不能代表空值,導致需要多些很多規則。x 哪 x 哪 2.匹配的時候,遇見同義詞只能新增規則,不能用類似正規表示式 這種方式解決,導致也需要寫很多模板。x 那 x 那 3.不能新增排除專案,只能通過aiml...

問答系統搭建過程

假設我們的庫裡面已有存在以下幾個 問題,答案 假設乙個使用者往系統中輸入了問題 是做什麼的?那這時候系統先去匹配最相近的 已經存在庫里的 問題。那在這裡很顯然是 是做什麼的 和 主要做什麼方面的業務?是最相近的。所以當我們定位到這個問題之後,直接返回它的答案 他們主要做人工智慧方面的教育 就可以了。...