最大匹配算法: 分词入门级算法 C#实现
最大匹配算法: 分词入门级算法,上面的是算法流程图, 网上各种多。
主要注意点:
1。 读取汉字时,注意streamreader的读取格式的定义:
StreamReader sr =
new StreamReader(@wordLibPath,
System.Text.Encoding.GetEncoding("gb2312"))
;
2。 算法很简单, 但, 想清楚写, 比直接上要快, 这样个破代码, 敲了我65分钟。我晕。
结果是这样的, 但是是最简单的, 当然要进行深化,用别的更好的方法。 待续。。。
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;
}
主要代码如上, 另外没别的。。