提取词库的程序中间停了好长时间,前几天改了一下,暂时算是写完了。实现了基本功能,去掉数字,去掉停用词,去掉标点符号。
印象比较深刻的几点是,程序的逻辑从模糊到清楚,从混乱复杂到比较简单。去掉了冗余的比较和无意义的区分。总体的逻辑没有变。按空格读取文本信息存入vector容器中。对每一个字符串,先检查是否含有字母,不含则直接移到下一个字符串。然后分为字符串头去符号检查,字符串中去符号检查,字符串尾去符号检查。最后判断是否是停用词。
在字符串头检查过程中,开始是用switch case,后来发现并不需要这么复杂的选择过程,直接去掉不是以字符或者数字开头的字符就可以了。
字符串中检查主要是针对/,以前还分为一条斜杠,两条斜杠和三条斜杠的情况,将斜杠前的部分直接存起来,斜杠后的部分压入容器尾端再处理,后来发现只需要判断有斜杠出现,将斜杠前的部分和斜杠后的部分分别存成新的字符串压入容器尾端就可以了。
字符串尾的检查开始设计的也很复杂,针对不同的符号;‘,。“:【】用switch case设计了一大堆,其中有很多是重复的。后来也发现我的需求只用把 . 提出来单独处理就可以了,其他的符号统统不需要。于是只用简单的判断语句就实现了。而且在处理的时候开始想要直接用引号”“比对字符串,后来发现引号本身没法处理,于是统一换成了ascii码值。
程序方面改了太多没有做记录,这个习惯不太好。有时候改着改着改乱了也没存,或者注释加的没规范没水平,都要慢慢养成好习惯。最后记得在对容器内每个元素进行处理的时候,开始是用迭代器的,后来发现在我处理斜杠的时候,有时候压入新的字符串程序就会出错(但是有的时候并不会,所以一直欺骗了我很长时间),好像是iterator is not incrementable。后来发现在容器长度可能变化的情况下,还是用size比较靠谱。因为在长度变化了的情况下,原有的迭代器会失效。用长度在循环的每一次都会重新计算,不会出问题。
停用词用的是这个网站的:http://www.ranks.nl/resources/stopwords.html
贴代码的时候才发现自己的代码好...幼稚...anyway 加油~ 努力学习吧!
void delepunc()
{
for(vector<string>::size_type ix=0;ix!=temp.size();ix++) //去标点符号
{
string stemp=temp[ix];
int cvcv=0;
bool xx=isdigits(stemp);
if(xx==true&&stemp.size()>1)
{
for(string::size_type iy=0;iy!=stemp.size();iy++)
{
if(iy==0) //处理首位标点符号
{
string::size_type j=iy;
while((stemp[j]<48||(57<stemp[j]&&stemp[j]<65)||(90<stemp[j]&&stemp[j]<97)||stemp[j]>122))
{
stemp=stemp.substr(j+1);
}
}
else if(iy==(stemp.length()-1)) //处理末位标点符号
{
string::size_type j=iy;
while((stemp[j]<48||(57<stemp[j]&&stemp[j]<65)||(90<stemp[j]&&stemp[j]<97)||stemp[j]>122)&&(stemp[j]!=46))
{
stemp=stemp.erase(j);
j=stemp.length()-1;
iy--;
}
j=stemp.length()-1;
if(stemp[j]==46)
{
if((stemp[j-1]>64)&&(stemp[j-1]<91)&&(stemp.length()<3))
{
break;
}
else
{
while((stemp[j]<48||(57<stemp[j]&&stemp[j]<65)||(90<stemp[j]&&stemp[j]<97)||stemp[j]>122))
{
stemp=stemp.erase(j);
j=stemp.length()-1;
}
}
break;
}
}
else //字符串中处理
{
if(stemp[iy]==47) //出现斜杠分隔的时候
{
string newstemp1=stemp.substr(iy+1);
string newstemp2=stemp.substr(0,iy);
temp.push_back (newstemp1);
temp.push_back (newstemp2);
stemp="aaa";
break;
}
}
}
}
}
}
环境:windows 7,visual studio 2012
出来的词库并不是文本分类可以直接使用的,还需要手动删减一些明显无意义的词条。更细致的规则我没有做,因为工作量并不大,手工删效果可能更好一些。