C++之基于正倒排索引的Boost搜索引擎项目数据清洗代码及详解(上)
1.为什么要进行数据清洗
这是因为我们获得的网页信息包含了很多我们不想要的部分(标签),同时我们需要把title还有content从网页里面提取出来,这样方便我们后期对其进行处理。
2. 怎么进行数据清洗
我们可以把这分为三步。
2.1 第一步
第一步就是通过Enumfile函数把src_path里面的文件名(带路径),保存到file_list中,方便后期对文件进行一个一个的读取。
PS:src_path里面存的就是没有被处理过的信息。
这一步的本质是把src_path里面的关于网页的部分先筛选出来,我们只需要以.html结尾的普通网页文件,其他的都不要。
2.2 第二步
把筛选后的文件去标签化,然后把其分为title和content并构建url,接着存入results里面。
PS:之所以要去标签是因为网页里面实际上包含了很多很多没有的部分,可能是文字的大小或者颜色之类的。我们要把这些全部都去除。
就是把这里打钩的全部提取出来。

2.3 第三步
把去标签后的信息全部给写入到output里面。
PS:我们看到这里可能会疑惑为什么不写到一起,为什么要一步就要换一个容器呢?这是为了防止代码因为其中一部分出现问题而崩溃或者出现我们不想看到的结果。我们要降低代码之间的关系,同时这样分开写还可以写一点编译一点,千万不要把所有的代码全部写完后再编译,这是会出现问题的。
typedef struct DocInfo { std::string title;//文档的标题 std::string content;//文档的内容 std::string url;//该文档在官网中的url }DocInfo_t; int main() { std::vector<std::string> file_list; //第一步:所以EnumFile,EnumFile函数通过递归的方式把src_path里面的文件名(带路径),保存到file_list中,方便后期对文件进行一个一个的读取。 if(!EnumFile(src_path,&file_list)) { std::cout<<"EnumFile error!!!"<<std::endl; return 1; } //第二步:读取file_list里面每一个文件的内容,并进行解析,然后解析进results std::vector<DocInfo_t> results; if(!ParseHtml(file_list,&results))//读取并解析 { std::cout<<"ParseHtml error"<<std::endl; return 2; } //第三步:把解析后的文件的内容写到output里面,然后按照/3作为每个文件的分隔符 if(!SaveHtml(results,output)) { std::cout<<"SaveHtml error"<<std::endl; return 3; } return 0; }