最大匹配演算法: 分詞入門級演算法,上面的是演算法流程圖, 網上各種多。
主要注意點:
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;
}
主要代碼如上, 另外沒別的。。