zoukankan      html  css  js  c++  java
  • 计算两个字符串之间是否包含的简单方法

    在前面介绍了两个字符串之间的匹配度 的算法

    计算字符串相似度算法—Levenshtein

    它解决了字符串A和B之间的相识度的问题,但是我现在遇到了一个新的问题,就是有字符串A是固定值,字符串C包括了字符串B,希望求出字符串C包括A的比率.但是我并没有找到很好的解决方案.于是自己写了一个可用的简单算法 .

    算法原理

    1.对固定的字符串A进行二元分词.得到一个字符数组.

    2.循环得到的数组,如果数组中的某个字符串在C中存在,计数加1

    3.计算下一个数组与上一个数组之间的距离做0.7(可根据实际需求调整)的指数距离并加到计数器

    4.将计数/数组的长度,得到一个比例.

    代码

        public static float IncludeStr(string val, string str)
        {
            //1.将val二远分词
            List<string> words = new List<string>(); 
            int i = 0;
            while (i < val.Length)
            {
                int m =  2;
                if (i + m >= val.Length)
                    m = 1;
                words.Add(val.Substring(i, m));
                i = i + 2;
            }
    
            float num = 0;
            int wordIndex = -1;
            foreach (string s in words)
            {
                int index = str.IndexOf(s);
    
                if (index >= 0)
                {
                    num = num + 1;
                    if (wordIndex > 0)
                    {
                        num += (float)Math.Pow(0.7, (index - wordIndex - s.Length + 1));
                    }
                    wordIndex = index;
                }
            }
    
            return num / words.Count;
        }
    

    2014.6.27日补

    在实际的使用过程中发现上面的效果并不是很好,于是用了一个更加简单暴力的方法。

    1. 循环短的那个字符串,长度为n,循环n次
    2. 每次取两个字符,一直到最后
    3. 如果在长的字符串里面能够找到,将变量m加1
    4. 最后返回m/n的比率

      发现这种简单粗暴的方法可以解决80%的问题。

        public static float includeStr1(string fname, string name)
        {
            int m = 0;
            for (int i = 0; i < name.Length; i++)
            {
                string s;
                if (i + 1 < name.Length)
                {
                    s = name.Substring(i, 2);
      
                }
                else
                {
                    s = name.Substring(i);
      
                }
                if (fname.IndexOf(s) >= 0)
                {
                    m++;
                } 
            } 
            return (float)m / (float)name.Length; 
        }
      
  • 相关阅读:
    scrapy框架持久化存储 以及响应参数
    scrapy框架
    12306 模拟登陆
    Python第三库---requests库详解
    批处理-----4.for循环中的变量
    批处理-----3. for循环详解
    批处理-----2.常用特殊符号
    批处理-----1.内部命令简介
    Python第三方库---requests库
    Python 自带标准库
  • 原文地址:https://www.cnblogs.com/ac1985482/p/3439100.html
Copyright © 2011-2022 走看看