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