📄 form1.cs
字号:
Encoding encode = Encoding.GetEncoding("GB18030");
using(StreamReader sr = new StreamReader(_fileNameStr,encode))
{
string _strTemp = "";
string _strTempRemain = "";
// bool _bStop = false;
while((_strTemp = sr.ReadLine() )!= null)//表示读取到文章末尾
{
if (_strTemp == "")
{
continue;
}
_strTemp = _strTempRemain+_strTemp;
_strTempRemain = "";
int startPos = 0;
int endPos =0;
// for (int i = 0; i< _strTemp.Length;i++)
// {
// if (_strTemp[i]=='。'|| _strTemp[i]=='!'|| _strTemp[i]=='?')
// {
// _strTempRemain = _strTemp.Substring(i+1);
// _strTemp = _strTemp.Substring(0,i+1);
// _bStop = true;
// break;
// }
// }//这种方法太笨拙....而且不利于扩展...20070505 10:00
do
{
endPos = _strTemp.IndexOfAny(_separatorsC,startPos);
if(endPos== -1)
{
//说明没有找到句子结束的标志,是一个句子的部分可能。
endPos = _strTemp.Length;
_strTempRemain = _strTemp.Substring(startPos,(endPos-startPos));
}
else
{
if(startPos != endPos)
{
string _str2Process = _strTemp.Substring(startPos,(endPos-startPos+1));
string resultStr=SegmentSentence(_str2Process);//对分出来的子句进行分词处理
using(StreamWriter sw = new StreamWriter(AlterFileName(_fileNameStr,_strExt),true,encode))
{
sw.Write(resultStr);
sw.Write("\r\n");
sw.Close();
}
}
}
startPos = endPos+1;
}while (startPos < _strTemp.Length);
// if (!_bStop)//说明没有找到句号or 其他句子结尾符号!
// {
// _strTempRemain = _strTemp;
// continue;
// } //20070505 10:00
// SegmentSentence(_strTemp);
// _bStop = false;//重新置标志位
}
if(_strTempRemain !="")//最后处理遗留的_strTempRemain的情况
{
string resultStr = SegmentSentence(_strTempRemain);
using(StreamWriter sw = new StreamWriter(AlterFileName(_fileNameStr,_strExt),true,encode))
{
sw.Write(resultStr);
sw.Write("\r\n");
sw.Close();
}
}
sr.Close();
}
DateTime dtStop = DateTime.Now;
System.TimeSpan diff1 = dtStop.Subtract(dtStart);
textBox1.Text = "分词使用时间为:"+diff1.Minutes.ToString()+"分"
+diff1.Seconds.ToString()+"秒"
+diff1.Milliseconds.ToString()+"毫秒";
MessageBox.Show("分词成功!","结果");
}
#endregion
#region ==改变文件名 ==
string AlterFileName(string _fileNameStr ,string extStr)
{
string _newFileNameStr = "";
for (int i = _fileNameStr.Length-1;i>=0; i--)
{
if (_fileNameStr[i]=='.')
{
_newFileNameStr = _fileNameStr.Insert(i,extStr);
}
}
if (_newFileNameStr == "")
{
_fileNameStr += ".txt";
return _fileNameStr;
}
return _newFileNameStr;
}
#endregion
#region == == 对句子(复合)句子的处理,包含了对字符等的处理==
string SegmentSentence(string _sentenceStr)
{
string s2 = "";
#region == 从字符串中删除回车和换行的程序,废弃==
// //首先先去除回车等符号。完成一个句子作为一行
// for (int i = 0; i< _sentenceStr.Length;i++)
// {
// if (_sentenceStr[i] == '\r' || _sentenceStr[i] == '\n')
// {
// _sentenceStr = _sentenceStr.Remove(i,1);
// i--;
// }
// }//这部分因为是readline而显得不那么重要了!
//MessageBox.Show(_sentenceStr);
#endregion
//处理非中文字符,C#中的string使用的是Unicode编码方式
int i= 0;
int j = 0;
while(_sentenceStr.Length!=0)
{//确定到长度为0,为止
char _cTemp = _sentenceStr[0];
if ((!char.IsPunctuation(_cTemp) )//char.IsLetter(_cTemp)
&&( (UInt16) _cTemp < 0x4E00 || (UInt16)_cTemp > 0x9FA5))
{//表示是字母但是不是中文字母
i = 1;
j = _sentenceStr.Length;
if (j >1)
{
while ((!char.IsPunctuation(_sentenceStr[i]))//char.IsLetter(_sentenceStr[i])
&& ((UInt16) _sentenceStr[i] < 0x4E00 || (UInt16)_sentenceStr[i] > 0x9FA5) && i< j-1)
{
i ++;//表示是字符,但是这其中也包含了中文字符,所以需要除去
}
}
s2 += _sentenceStr.Substring(0,i)+ _Separator;
_sentenceStr = _sentenceStr.Substring(i,j-i);
continue;
}
else//不是字母,可能是控制符号,或者标点符号等
{
//如果是标点符号..
if (char.IsPunctuation(_cTemp))
{
i = 1;
j = _sentenceStr.Length;
if(j > 1)
{
while (char.IsPunctuation(_sentenceStr[i]) && i< j-1)
{
i++;
}
}
else
{
}
s2 += _sentenceStr.Substring(0,i)+_Separator;
_sentenceStr = _sentenceStr.Substring(i,j-i);
continue;
}
}
//处理中文字
i = 1;
j = _sentenceStr.Length;
if (j >1)
{
while (//char.IsLetter(_sentenceStr[i]) &&
(UInt16)_sentenceStr[i]>= 0x4E00 && (UInt16) _sentenceStr[i] <= 0x9FA5 && i < j-1)
{
i++;
}
}
//s2+=SegmentString(_sentenceStr.Substring(0,i));
s2+=SegmentStringArrayList(_sentenceStr.Substring(0,i));
_sentenceStr= _sentenceStr.Substring(i,j-i);
}
return s2;
}
#endregion
#region == 分词中文字符串==
string SegmentString(string _strStr)
{
string s2 = "";
int _iNUmber = 0;
while (_strStr.Length != 0)
{
if (_strStr.Length <= _iNumberMax)//计算长度
{
_iNUmber = _strStr.Length;
}
else
{
_iNUmber = _iNumberMax;
}
//在数据据库中寻找这个词,直到找到,或者直到只有一个词为止
string tempQuery = _strStr.Substring(0,_iNUmber);
int freq = -1;
string strQuery = "word='"+tempQuery+"'";
DataRow[] dr = _dataSet.Tables["words"].Select(strQuery);
if (dr.Length > 0)
{
freq = (int)dr[0]["wfreq"];
}
// foreach (DataRow dr in _dataSet.Tables["words"].Rows)
// {
// if ((string)dr["word"] == tempQuery)
// {
// freq = (int)dr["wfreq"];
// }
// }
while(freq == -1)//说明存在
{
freq = -1;
if(_iNUmber ==1)//表示如果在一个词,但是没有找到...
{
break;
}
else
{
_iNUmber -= 1;
}
tempQuery = _strStr.Substring(0,_iNUmber);
strQuery = "word='"+tempQuery+"'";
dr = _dataSet.Tables["words"].Select(strQuery);
if (dr.Length > 0)
{
freq = (int)dr[0]["wfreq"];
}
// foreach (DataRow dr in _dataSet.Tables["words"].Rows)
// {
// if ((string)dr["word"] == tempQuery)
// {
// freq = (int)dr["wfreq"];
// }
// }
}//不到-1的时候结束,说明存在
s2 += tempQuery+ _Separator;
_strStr = _strStr.Substring(_iNUmber,_strStr.Length-_iNUmber);
}
return s2;
}
#endregion
#region == 分词中文字符串 ArrayList==
string SegmentStringArrayList(string _strStr)
{
string s2 = "";
int _iNUmber = 0;
while (_strStr.Length != 0)
{
if (_strStr.Length <= _iNumberMax)//计算长度
{
_iNUmber = _strStr.Length;
}
else
{
_iNUmber = _iNumberMax;
}
//在数据据库中寻找这个词,直到找到,或者直到只有一个词为止
string tempQuery = _strStr.Substring(0,_iNUmber);
int freq = -1;
int indexInArrayLib = (UInt16) tempQuery[0]-0x4E00;
wordsStr wordTemp = new wordsStr();
for(int i = 0; i< LibArray[indexInArrayLib].Count;i++)
{
wordTemp = (wordsStr) LibArray[indexInArrayLib][i];
if (wordTemp.wordPrase == tempQuery)
{
freq = wordTemp.wFreq;
break;
}
}
while(freq == -1)//说明不存在
{
freq = -1;
if(_iNUmber ==1)//表示如果在一个词,但是没有找到...
{
break;
}
else
{
_iNUmber -= 1;
}
tempQuery = _strStr.Substring(0,_iNUmber);
indexInArrayLib = (UInt16) tempQuery[0]-0x4E00;
for(int i = 0; i< LibArray[indexInArrayLib].Count;i++)
{
wordTemp = (wordsStr)LibArray[indexInArrayLib][i];
if (wordTemp.wordPrase == tempQuery)
{
freq = wordTemp.wFreq;
break;
}
}
}//不到-1的时候结束,说明存在
s2 += tempQuery+ _Separator;
_strStr = _strStr.Substring(_iNUmber,_strStr.Length-_iNUmber);
}
return s2;
}
#endregion
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -