现在的位置: 首页 > 综合 > 正文

最大匹配算法: 分词入门级算法 C#实现

2012年01月08日 ⁄ 综合 ⁄ 共 1661字 ⁄ 字号 评论关闭

QQ截图未命名

最大匹配算法: 分词入门级算法,上面的是算法流程图, 网上各种多。

主要注意点:

1。 读取汉字时,注意streamreader的读取格式的定义:

StreamReader sr =
                        new StreamReader(@wordLibPath,
                            System.Text.Encoding.GetEncoding("gb2312"))
                    ;

2。 算法很简单, 但, 想清楚写, 比直接上要快, 这样个破代码, 敲了我65分钟。我晕。

123

结果是这样的, 但是是最简单的, 当然要进行深化,用别的更好的方法。 待续。。。

private string skipBlanks( string strInput )
{
    char[] strArray = strInput.ToCharArray();
    int wordLen = strInput.Length;
    strInput = "";

    for (int i = 0; i < wordLen; i++)
    {
        if (strArray[i] == ' ' || strArray[i] == '\n'
            || strArray[i] == '\t')
            continue;
        else
            strInput += strArray[i];
    }

    return strInput;
}

private string maxBackfowardPatch(string strInput)
{
    strInput = skipBlanks(strInput);

    string strWord = "";
    string strOutput = "";
    int leftIdx = strInput.Length;
    char[] strArray = strInput.ToCharArray();
    int wordLen = leftIdx;
    List<int> segPos = new List<int>(); //分段点
    int subLen = 0;

    /*最大后向匹配算法*/
    {
        while (!strInput.Equals(""))
        {
            bool flag = true;

            while (leftIdx > 0 && subLen < maxLen)
            {
                strWord = strInput.Substring(--leftIdx, ++subLen);

                if (wordLib.Contains(strWord))
                {
                    segPos.Add(leftIdx);
                    segPos.Add(leftIdx + subLen);
                    flag = false;
                    break;
                }
            }
            if (flag)
                leftIdx = strInput.Length - 1;
            strInput = strInput.Remove(leftIdx);
            leftIdx = strInput.Length;
            subLen = 0;
        }
    }

    //输出窜
    for (int i = 0; i < wordLen; i++) {
        if (segPos.Contains(i)) strOutput += '/';
        strOutput += strArray[i];
    }
    segPos.Clear();

    return strOutput;
}

主要代码如上, 另外没别的。。

抱歉!评论已关闭.