📄 segmentation.cpp
字号:
// Segmentation.cpp: implementation of the Segmentation class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Segmentation.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
string Segmentation::Segment (ifstream & fin)
{
string cResult;//存储分词结果
char cStr[500];//存储从原文件中读取的字符串
char cWord[22];//存储从cStr中切取下来的一段字符串,最长定义为10个汉字长
int nLength = 0;//记录从cStr中切取下来的字符串的长度
int nTotalLen = 0;//记录从cStr中切取下来的字符串在cStr中的末尾位置
//读取网页URL
fin.getline (cStr,sizeof(cStr),'\n');
cResult = cResult + cStr + "\n";
//从要切分的文件中读出一个字符串,对该字符串进行切词
while(!fin.eof ()){//非文件结束
fin >> cStr;
nTotalLen = 0;
while(1){
nLength = 0;
//如果nTotalLen位置存储的不是汉字,则从下一个字母开始
while(cStr[nTotalLen] > 0)
nTotalLen ++;
//从cStr中截取最大长度为10个字的字符串
for(int i = nTotalLen;cStr[i] != '\0' && (i - nTotalLen) < 20;i ++){
cWord[i - nTotalLen] = cStr[i];
nLength ++;
}
cWord[nLength] = '\0';
nTotalLen = nTotalLen + nLength;
while(nLength > 2){
//找到匹配的词则跳出
if(SearchInHash(cWord))
break;
//如果没有找到匹配的词,则将该词的最后一个字切去然后进行匹配
else{
//词长度减一
nLength = nLength - 2;
cWord[nLength] = '\0';
nTotalLen = nTotalLen - 2;
}
}
//如果词有匹配的或者是单字,则将其接到cResult后面并加上空格
if(nLength >= 2)
cResult = cResult + cWord + " \0";
else break;
}
}
//返回切词结果
return cResult;
}
string Segmentation::Segment (string & cString)
{
string cResult;//存储分词结果
string cStr;//存储从原字符串中切取的字符串
char cWord[22];//存储从cStr中切取下来的一段字符串,最长定义为10个汉字长
int nLength = 0;//记录从cStr中切取下来的字符串的长度
int nTotalLen = 0;//记录从cStr中切取下来的字符串在cStr中的末尾位置
//从要处理的字符串中切取一段字符串,对该字符串进行切词
while(cString.size () > 0){
int nPos;
nPos = cString.find (" ");
cStr = cString.substr (0,nPos);
cStr = cStr + "\0";
cString = cString.substr (nPos+1,cString.length ());
if(cStr.length () == 0)
continue;
nTotalLen = 0;
while(1){
nLength = 0;
//如果nTotalLen位置存储的不是汉字,则从下一个字母开始
while(cStr[nTotalLen] > 0)
nTotalLen ++;
//从cStr中截取最大长度为10个字的字符串
for(int i = nTotalLen;cStr[i] != '\0' && (i - nTotalLen) < 20;i ++){
cWord[i - nTotalLen] = cStr[i];
nLength ++;
}
cWord[nLength] = '\0';
nTotalLen = nTotalLen + nLength;
while(nLength > 2){
//找到匹配的词则跳出
if(SearchInHash(cWord))
break;
//如果没有找到匹配的词,则将该词的最后一个字切去然后进行匹配
else{
//词长度减一
nLength = nLength - 2;
cWord[nLength] = '\0';
nTotalLen = nTotalLen - 2;
}
}
//如果词有匹配的或者是单字,则将其接到cResult后面并加上空格
if(nLength >= 2)
cResult = cResult + cWord + " \0";
else break;
}
}
//返回切词结果
return cResult;
}
void Segmentation::Segment (const string & cStr,CDeque<string> & Deque)
{
char cWord[22];//存储从cStr中切取下来的一段字符串,最长定义为10个汉字长
int nLength = 0;//记录从cStr中切取下来的字符串的长度
int nTotalLen = 0;//记录从cStr中切取下来的字符串在cStr中的末尾位置
nTotalLen = 0;
while(1){
nLength = 0;
//如果nTotalLen位置存储的不是汉字,则从下一个字母开始
while(cStr[nTotalLen] > 0)
nTotalLen ++;
//从cStr中截取最大长度为10个字的字符串
for(int i = nTotalLen;cStr[i] != '\0' && (i - nTotalLen) < 20;i ++){
cWord[i - nTotalLen] = cStr[i];
nLength ++;
}
cWord[nLength] = '\0';
nTotalLen = nTotalLen + nLength;
while(nLength > 2){
//找到匹配的词则跳出
if(SearchInHash(cWord))
break;
//如果没有找到匹配的词,则将该词的最后一个字切去然后进行匹配
else{
nLength = nLength - 2;
cWord[nLength] = '\0';
nTotalLen = nTotalLen - 2;
}
}
//如果词有匹配的或者是单字,则将其载入队列
if(nLength >= 2){
if(nLength > 2)
Deque.push_back(cWord);
}
else break;
}
}
void Segmentation::BuildHash (ifstream & fin){
char Word[50];//存储从字典中读出的词
while(1){
if(fin.eof ())
break;
fin >> Word;
//插入散列表中
m_DictWords.Insert (Word);
}
}
bool Segmentation::SearchInHash (const char * Word){
if(m_DictWords.Find (Word))
return true;
else return false;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -