算法之智能搜索(下)

以下内容,并未得到实质检测。因为笔者没有用到相关的需求,只是一时兴起,按照自己的思路探究了一下。并未考虑什么付费排名,词语优先级,搜索量排名,时效性等等的因素。娱乐一下呗,可能会被真正做过此类搜索的大神笑话,担待自己瞎想的。

二、简单算法分词匹配:

/**简单算法之
 * 拆分用户输入框输入的语句,进行最大化匹配查询
 * @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;
}

【注意】
以上方法并未在真实场景中的应用,还有许多未考虑的因素,笔者想若此方法行的通的话,还有许多值得考虑和优化的地方。

转载于:https://blog.51cto.com/13479739/2321591

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值