⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 form1.cs

📁 参考詹卫东写的分词程序
💻 CS
📖 第 1 页 / 共 2 页
字号:
			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 + -