思路大概有了正在试验,看看能不能成功php5 的新函数 str_split()

解决方案 »

  1.   

    str_split() 不能区分中文字符。
      

  2.   

    不用循环好像实现不了吧,即使用了STR_SPLIT也还得用循环吧
      

  3.   

    <?php
    $A = "我们是最好的";
    $B = "我们不是最差的";preg_match_all('/[\x81-\xfe]./', $A, $a);
    preg_match_all('/[\x81-\xfe]./', $B, $b);$ar = array_intersect($a[0], $b[0]);print_r($ar);
    ?>
    得到:
    Array ( [0] => 我 [1] => 们 [2] => 是 [3] => 最 [5] => 的 )完全不用循环是得不到最终结果的,php并没有提供检查下标是否连续的函数。
    而不用循环是不能完成这个工作的
    你需要在$ar[$i]处检查$ar[$i+1]是否存在,来决定后续的动作
      

  4.   

    唠叨跟我的思路是一样的,不过我在使用array_intersect前再用了STR_SPLIT分“词”
    因为检查一个字是没有用的,两篇文章必然存在“得地的”的相同循环还是要用的,不过不是用于比较,而是用于多次分“词”基本上已达到我的需求,谢各位!有了这个基础,我不久后会发一篇应用文章上来。
      

  5.   

    另对唠叨打个补充,我在win下php5(好像4.3也一样)要用\\x81,用\x81好像会出错?
      

  6.   

    <SCRIPT LANGUAGE="JavaScript">
    function meizz(a, b, n) // n必须大于等于2
    {
        var mm = new Array();
        for(var i=0; i<a.length; )
        {
            for(var j=i+n; j<a.length; j++)
            {
                var s = a.substring(i, j);
                if(b.indexOf(s)==-1)
                {
                    if(s.length>n)
                    {
                        mm[mm.length] = a.substring(i, j-1);
                    }
                    break;
                }
            }
            i=j-1;
        }
        //return mm.Unique().join(","); //去除数组里的重复项
        return mm.join(",");
    }Array.prototype.Unique = function()
    {
      var a = {}; for(var i=0; i<this.length; i++)
      {
        if(typeof a[this[i]] == "undefined")
          a[this[i]] = 1;
      }
      this.length = 0;
      for(var i in a)
        this[this.length] = i;
      return this;
    };
    var a = "完全不用循环是得不到最终结果的,php并没有提供检查下标是否连续的函数。而不用循环是不能完成这个工作的循环还是要用的,不过不是用于比较,而是用于多次分词";
    var b = "唠叨跟我的思路是一样的,不过我在使用array_intersect前再用了STR_SPLIT分“词”因为检查一个字是没有用的,两篇文章必然存在“得地的”的相同";
    alert("返回的结果:"+ meizz(a, b, 2));
    </SCRIPT>
      

  7.   

    1、str_split只在php5才可使用,并且不能正确处理汉字。你也不能保证文字中不出现半角字符,比如标点、字母、数字
    2、规则串中的十六进制数要用\x做前导,这是规则。在哪里都一样。至于你的“要用\\x81,用\x81好像会出错”,可能是你的编辑器的问题。
    3、真正的分词动作是这样的(按最大匹配法)
    我们是最好的
    被分解为:
    我们是最好的
    我们是最好 的
    我 们是最好的
    我们是最 好的
    我 们是最好 的
    我们 是最好的
    我们是 最好的
    我 们是最 好的
    我们 是最 好的
    我 们是 最好 的然后做后续动作每篇文章都会出现的“得地的”并不是无用的,他在语义分析中很重要
      

  8.   

    上面我的回复有一点逻辑BUG,再改之:
    <SCRIPT LANGUAGE="JavaScript">
    function meizz(a, b, n)
    {
        var mm = new Array();
        for(var i=0; i<a.length; i++)
        {
            for(var j=i+n; j<a.length; j++)
            {
                var s = a.substring(i, j);
                if(b.indexOf(s)==-1)
                {
                    if(s.length>n)
                    {
                        mm[mm.length] = a.substring(i, j-1);
                        i = j-2;
                    }
                    break;
                }
            }
            
        }
        return mm.Unique().join(","); //去除数组里的重复项
        //return mm.join(",");
    }Array.prototype.Unique = function()
    {
      var a = {}; for(var i=0; i<this.length; i++)
      {
        if(typeof a[this[i]] == "undefined")
          a[this[i]] = 1;
      }
      this.length = 0;
      for(var i in a)
        this[this.length] = i;
      return this;
    };
    var a = "我们是最好的";
    var b = "我们不是最差的";
    //结果得出"我们"&"是最"
    alert("返回的结果:"+ meizz(a, b, 2));
    </SCRIPT>
      

  9.   

    再次改进:
    <SCRIPT LANGUAGE="JavaScript">
    function meizz(a, b, n)
    {
        var c=a.length>b.length?b:a;
        if(b==c) b=a; a=c; //少做些循环
        if(!n) n=1;
        var mm = new Array();
        for(var i=0; i<a.length; i++)
        {
            for(var j=i+n; j<=a.length; j++)
            {
                var s = a.substring(i, j);
                if(b.indexOf(s)==-1)
                {
                    if(s.length>n)
                    {
                        mm[mm.length] = a.substring(i, j-1);
                        i = j-2;
                    }
                    break;
                }
                else
                {
                    if(j==a.length)
                    {
                        mm[mm.length]=s;
                    }
                }
            }
            
        }
        return mm.Unique().join(","); //去除数组里的重复项
        //return mm.join(",");
    }Array.prototype.Unique = function()
    {
      var a = {}; for(var i=0; i<this.length; i++)
      {
        if(typeof a[this[i]] == "undefined")
          a[this[i]] = 1;
      }
      this.length = 0;
      for(var i in a)
        this[this.length] = i;
      return this;
    };
    var a = "我们是最好的了";
    var b = "我们不是最差的了";
    //结果得出"我们"&"是最"&"的了"
    alert("返回的结果:"+ meizz(a, b, 2));
    </SCRIPT>
      

  10.   

    meizz(梅花雪) 强悍!我会参考你的思路的
    我现在还只能做纯中文固定字数的匹配,感谢!
      

  11.   

    这个想法是不会放弃的,至于实用性是另一个问题我业余是从事多因素分析研究的(主要是数学模式识别法)
    这是我首次把数学的方法应用到文字上(或者说语言学)
    这帖子不是为了完成这个“任务”,而是为了探讨方法统计学本身就是用大量的循环迭代完成数学模式的构建的,然后再用于识别
    最小二乘法、目前流行的神经网络算法都是用循环和断点构建数学模型的
    我上面所说“不使用循环”,意思是指不把循环用于判别比较(这点可能没说清楚)
    因为直接用循环用于比较在模式识别上是没有意义的,因为这样模式构建过程被省略了其次,希望大家开放思路,我并没有说最终就用php去解决所有问题
    因为以web服务器去完成这些工作意义也不大,我只是寻求一种思路
    特别是php里面数组交集/差集函数很有启发性尽量少用循环也是为了把CPU资源用在以后更复杂的模式构建部分
    如果一种比较有效的思路出了来,应用到C++/C#或者JAVA可发挥的作用就很大现在限定的条件很多,例如gb2312等等,但简单思路出来以后,很多东西是可以扩展的