【C++】狗屁不通文章生成器2.0
1 前言
继上次【C++】狗屁不通文章生成器之后,很久不想看一眼这个代码,因为当时写这个代码深受中文字符的处理烦恼。而且现在回看,程序的模块化、可读性使我大受震惊,是在想不到当时的我为什么要这样做。于是昨天无心工作,想到了把这堆乐色改进一下,至少做到能看的水平。遂记之。
2 改进
2.1 字词的前后关系
为了表示字词的前后关系,即将句子划分为前缀词+后缀词的关系,依然需要定义一个class wordpair
,这里去除一些数据上的冗余,强化了类的封闭性。
class wordpair
{
private:
string preword; // 前缀
map<string, int> sufwords; // 后缀,次数
int count; // 总次数
public:
wordpair(string pre);
wordpair(string pre, string suf);
wordpair(string pre, map<string, int> suf);
~wordpair();
string getPreword() const;
map<string, int> getSufwords() const;
void setPreword(string pre);
void setSufwords(map<string, int> suf);
string toJson() const;
void addSufword(string suf);
string chooseSufword() const;
};
采用map
记录后缀的出现次数,数据的结构性更强,也易于查找。记录所有后缀出现的总次数是为了在生成文章时选择后缀提供方便(具体作用看3.1.3)
2.2 文章生成系统
将太多的操作塞进main()
函数的做法不够美观,且容易忘记各个部分的功能。于是这里将文章生成的功能抽象出来,作为一个类。主要的工作是记录所有的字词对、记录生成的、文件流操作、文章生成等逻辑。
class createArticle
{
private:
vector<wordpair> wordpairlist;
string article;
public:
createArticle();
~createArticle();
void importWords(string filename, int len_pre = 1, int len_suf = 1);
void exportWords(string filename);
void