开始做毕业设计了,题目是基于统计的自动文摘系统。
语言要求是vs08以上的c++,对于我这c#,java,python的代码经验比较足的人,觉得脑袋发蒙。
当然,导师的要求,就得遵从。当年做嵌入式,c++的代码经验也是有的,不过是在linux下的qt。
自动文摘的步骤:
(1)计算词的权值;
(2)计算句子的权值;
(3)将原文中的所有句子按权值高低降序排列,权值最高的若干句子被确定为文摘句;
(4)将所有文摘句按照它们在原文中的出现顺序输出。
在自动文摘中,计算词权、句权、选择文摘句的依据是文本的6种形式特征:词频、标题、位置、句法结构、线索词和指示性短语。
当然,分词不是我的重点,所以我使用了一个第三方的分词库。
中科院的NLPIR ICTCLAS分词工具包
下面是当时使用NLPIR库开发的步骤,中间遇到的问题都记录了下来。
____________________________________________________________
| |
| NLPIR ICTCLAS分词工具包 |
| 官方地址:http://ictclas.nlpir.org |
| 自然语言处理与信息检索共享平台 http://www.nlpir.org |
| |
| 中科院计算所 |
| |
|____________________________________________________________|
1.获取官方开发包(c++版)
开发包的相关信息参照官方给的readme
2.demo开发
把 1> Data文件夹
2> bin目录下的NLPIR.dll 动态库文件
3> include文件下的 NLPIR.h 文件
4> lib目录下的NLPIR.lib 文件
全部拷贝到自己的工程目录下。
需要使用库的地方或头文件,添加如下代码:
——————————————————————————————————
#include "NLPIR.h"
#pragma comment(lib,"NLPIR.lib") //没有分号哦,这是包含库文件
——————————————————————————————————
Demo code (vs 2010 控制台项目):
——————————————————————————————————
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <string>
#include "NLPIR.h"
#pragma comment(lib,"NLPIR.lib") //没有分号哦,这是包含库文件
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
ifstream fin("test.txt",ios::in);
if(!fin){cout<<"test.txt file read error!"<<endl; return -1;}
string text,tempstr;
while (!fin.eof())
{
getline(fin,tempstr);
text += tempstr+"\r\n";
}
//cout<<text<<endl;
if (!NLPIR_Init())
{
cout<<"NLPIR_Init() error!"<<endl;
return -1;
}
string resulttext = NLPIR_ParagraphProcess(text.c_str(),1);
cout<<resulttext<<endl;
NLPIR_Exit();
return 0;
}
—————————————————————————————————————
编译如果出现如下错误:
LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
解决方法如下:
项目\属性\配置属性\清单工具\输入和输出\嵌入清单:原来是“是”,改成“否”。
然后再次编译就应该可以运行了,之外的其他问题,自行google解决之吧。
==========================================================================================
关于c++编程的一些小的要点:
1.使用 #pragma once 可以使多次被引用的头文件只被引用一次
2.出现类似于如下错误的时候:
-------------------------------------------------------------------------------------------------------------------------------------------------------------
错误 2 error LNK2019: 无法解析的外部符号 "enum CommonStatus __cdecl GetKeyWords(class std::
basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,struct KeyWord
*)" (?GetKeyWords@@YA?AW4CommonStatus@@V?$basic_string@DU?$char_traits@D@std@@V?$allocator
@D@2@@std@@PAUKeyWord@@@Z),该符号在函数 _wmain 中被引用 E:\作业\毕业设计\分词器测试
&入门帮助文档\分词器\分词器.obj 分词器测试
-------------------------------------------------------------------------------------------------------------------------------------------------------------
GetKeyWords这个函数可能你只是声明了而没有实现,尤其是存在同名的重载的时候,一定要仔细检查每
个重载是否在声明后实现了。3.c++编程的时候尽量不要使用很多c语言的东西,混用可能会在一定程度上
提高程序的性能,但是也会带来很多数据在格式化,内存对齐的时候出现意外的错误,而且让你找不到北。
4.c++编程中,最担心的就是内存相关的操作了,为了避免内存操作出问题,在你没有理解静态数据区,堆
和栈的具体作用前,就避免使用任何指针相关的操作,同时,所有的数据操作要利用函数进行封装,要作
为参数的变量(尤其是指针)要判断需不需要加引用。尽量避免在局部作用域创建变量和申请内存。
整理:2013 12 29 如有疑问,请联系我:[email protected]