标签:算法 ring substring ati ase final 数据库 else 检测
以下内容,并未得到实质检测。因为笔者没有用到相关的需求,只是一时兴起,按照自己的思路探究了一下。并未考虑什么付费排名,词语优先级,搜索量排名,时效性等等的因素。娱乐一下呗,可能会被真正做过此类搜索的大神笑话,担待自己瞎想的。/**简单算法之
* 拆分用户输入框输入的语句,进行最大化匹配查询
* @param str:用户输入的查询内容
* Red_Ant 20181124
*/
public static final String PUTUATION = "。,、':∶;?‘’“”〝〞?ˇ﹕︰﹔﹖﹑·¨….?;!′?!~—ˉ|‖"〃`@﹫??﹏﹋﹌︴々﹟#﹩$﹠&﹪%*﹡﹢﹦﹤‐ ̄ˉ―﹨??﹍﹎+=<--__-\\ˇ~﹉﹊()〈〉??﹛﹜『』〖〗[]《》〔〕{}「」【】︵︷︿︹︽_﹁﹃︻︶︸﹀︺︾ˉ﹂﹄︼";
public static List<String> dealInputStr(String str) {
/*我们输入内容进行查询之后,总会有一些优先显示在最前面(付费排名的除外)
* 假设,查出的最终结果是String类型的
*/
//1、创建存储最终结果的集合
List<String> resultLst = new ArrayList<String>();
//2、优先级最高的就是,把用户输入的内容看做一个整体查出的内容
List<String> strLst = selectStrFromDataBase(str);//从相应的库中查询,内容。方法不同,此处略!
if(strLst.size() > 0) {
resultLst.addAll(strLst);
}
//3、接着我们利用,用户输入中的标点,将输入语句分割成不同的str【以常用标点为例】
//笔者又想到,标点也有许多区别,和优先之分。算啦,不做深究了。
String[] strs = str.split("");
int strsLength = strs.length;
List<Integer> num = new ArrayList<Integer>();
for (int i = 0; i < strsLength; i++) {
if(PUTUATION.contains(strs[i])) {
num.add(i);
}
}
//将输入语句,按照标点的位置进行分词
int j = 0;//存储截取字符串位置
/*用于存储,标点分词之后的结果
* 然后依照此结果进行细胞分词
*/
String ss;
List<String> pttstrLst = new ArrayList<String>();
for (int i = 0; i < num.size(); i++) {
if(i == num.size()-1) {
ss = str.substring(j);
}else {
ss = str.substring(j, num.get(i));
}
pttstrLst.add(ss);
strLst = selectStrFromDataBase(ss);
if(strLst.size() > 0) {
resultLst.addAll(strLst);
}
j = num.get(i) + 1;
}
/*4、将标点分词后的结果进行细胞分词
* 利用字符字数逐步-1,的左右相邻截取方式,将分词后的内容,分别匹配细胞词库
* 每减少一n字,或有n+1种可能,直到只剩两个字为止。
*/
String ss1;
for (int i = 0; i < pttstrLst.size(); i++) {
//jugeWord(String str),查询数据库的方法略!
ss = pttstrLst.get(i);
int len = ss.length() - 2;
int s = 0;
int strlen = ss.length();
while (len > 1) {
int len1 = strlen - 2;
while (len1 < strlen-1) {
ss1 = ss.substring(s, len1);
if(!jugeWord(ss1)) {
strLst = selectStrFromDataBase(ss1);
if(strLst.size() > 0) {
resultLst.addAll(strLst);
}
}
s++;
len1++;
}
len--;
}
}
return resultLst;
}
【注意】
以上方法并未在真实场景中的应用,还有许多未考虑的因素,笔者想若此方法行的通的话,还有许多值得考虑和优化的地方。
标签:算法 ring substring ati ase final 数据库 else 检测
原文地址:http://blog.51cto.com/13479739/2321591