最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用C++實(shí)現(xiàn)簡(jiǎn)單的文章生成器

 更新時(shí)間:2024年03月22日 11:28:31   作者:武的階乘  
這篇文章主要為大家詳細(xì)介紹了鵝湖使用C++實(shí)現(xiàn)簡(jiǎn)單的狗屁不通文章生成器,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以了解下

1 前言

繼上次【C++】狗屁不通文章生成器之后,很久不想看一眼這個(gè)代碼,因?yàn)楫?dāng)時(shí)寫(xiě)這個(gè)代碼深受中文字符的處理煩惱。而且現(xiàn)在回看,程序的模塊化、可讀性使我大受震驚,是在想不到當(dāng)時(shí)的我為什么要這樣做。于是昨天無(wú)心工作,想到了把這堆樂(lè)色改進(jìn)一下,至少做到能看的水平。遂記之。

2 改進(jìn)

2.1 字詞的前后關(guān)系

為了表示字詞的前后關(guān)系,即將句子劃分為前綴詞+后綴詞的關(guān)系,依然需要定義一個(gè)class wordpair,這里去除一些數(shù)據(jù)上的冗余,強(qiáng)化了類(lèi)的封閉性。

class wordpair
{
private:
    string preword;            // 前綴
    map<string, int> sufwords; // 后綴,次數(shù)
    int count;                 // 總次數(shù)

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記錄后綴的出現(xiàn)次數(shù),數(shù)據(jù)的結(jié)構(gòu)性更強(qiáng),也易于查找。記錄所有后綴出現(xiàn)的總次數(shù)是為了在生成文章時(shí)選擇后綴提供方便(具體作用看3.1.3)

2.2 文章生成系統(tǒng)

將太多的操作塞進(jìn)main()函數(shù)的做法不夠美觀,且容易忘記各個(gè)部分的功能。于是這里將文章生成的功能抽象出來(lái),作為一個(gè)類(lèi)。主要的工作是記錄所有的字詞對(duì)、記錄生成的、文件流操作、文章生成等邏輯。

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 addWordPair(string pre, string suf);
    void generateArticle(string startword, int lenout = 10000);
    void printArticle(string filename);
};

3 實(shí)現(xiàn)(部分)

由于大多函數(shù)都很簡(jiǎn)單,這里只貼出部分比較重要的函數(shù)。

3.1 class wordpair

除去構(gòu)造函數(shù)、類(lèi)成員輸出輸入等函數(shù),我們直接進(jìn)入主題。

3.1.1 轉(zhuǎn)化為 json

這個(gè)函數(shù)主要是為了輸出格式化的詞對(duì),而文本文件中json格式的結(jié)構(gòu)性且簡(jiǎn)單。

ps: 其實(shí)這個(gè)函數(shù)不太重要,主要目的是檢查。不過(guò)也可以為直接讀詞對(duì)做準(zhǔn)備(雖然這里沒(méi)有從文件導(dǎo)入詞對(duì)的功能)

string wordpair::toJson() const
{
    string str = "\"";
    str += this->preword + "\" : {";

    for (auto &it : this->sufwords)
    {
        str += "\"" + it.first + "\"" + ":" + to_string(it.second) + ",";
    }
    str += "}";
    return str;
}

效果演示:

3.1.2 添加后綴詞

添加后綴的函數(shù),邏輯是:

if 這個(gè)后綴已經(jīng)有記錄 then count++;

else 添加新的后綴到map中

void wordpair::addSufword(string suf)
{
    for (auto &it : this->sufwords)
    {
        if (it.first == suf)
        {
            it.second++;
            return;
        }
    }
    this->sufwords[suf] = 1; // if the word is not in the map, add it with a count of 1
}

3.1.3 選擇后綴詞

這個(gè)函數(shù)的主要功能是從眾多后綴詞中選取一個(gè)(語(yǔ)料庫(kù)大的話就會(huì)多啦),選擇的策略是隨機(jī)數(shù)的方案,類(lèi)似于轉(zhuǎn)盤(pán)抽獎(jiǎng)。實(shí)現(xiàn)方法如下:

string wordpair::chooseSufword() const
{
    if (this->sufwords.size() == 1)//如果只有一個(gè)后綴詞就直接輸出,減少算力負(fù)擔(dān)
    {
        return this->sufwords.begin()->first;
    }
    else
    {
        // 隨機(jī)選擇一個(gè)后綴詞
        random_device rd;
        ranlux48 engine(rd());
        uniform_int_distribution<> dist(0, this->count);//在類(lèi)中定義了count,這里就省掉了遍歷
        int random_number = dist(engine);//產(chǎn)生一個(gè)隨機(jī)數(shù)

        std::string result;
        for (auto &it : this->sufwords)//抽獎(jiǎng)
        {
            if (random_number < it.second)
            {
                result = it.first;
            }
            else
                random_number -= it.second;
        }
        return result;
    }
}

3.2 class createArticle

3.2.1文本分割

vector<string> charlist = splitchar(filestr);//先將從文件讀到的字符串分割
    string preword = "", sufword = "";
    for (int i = 0; i < charlist.size() - len_suf - len_pre; i++)//每次向后移動(dòng)一個(gè)字符,進(jìn)行切割
    {
        preword = "", sufword = "";
        for (int j = i; j < i + len_pre + len_suf; j++)
        {
            if (j - i < len_pre)
            {
                preword += charlist[j];//從第i個(gè)字符開(kāi)始,到第i+len_pre個(gè)字符連接起來(lái)作為前綴
            }
            else
            {
                sufword += charlist[j];//從第i+len_pre個(gè)到字符開(kāi)始,到第i+len_pre+len_suf個(gè)字符連接作后綴
            }
        }
        this->addWordPair(preword, sufword);//添加進(jìn)wordpairlist
    }

3.2.2生成文章

/*
startword——啟動(dòng)詞
lenout——長(zhǎng)度限制(避免無(wú)限循環(huán))
*/
void createArticle::generateArticle(string startword, int lenout)
{
    this->article += startword;
    bool stop; // 加一個(gè)停止標(biāo)志,當(dāng)無(wú)法匹配到前綴時(shí)停止
    int prewordlen = this->wordpairlist.front().getPreword().length();
    int sufwordlen = this->wordpairlist.front().getSufwords().begin()->first.length();
    string lastword;
    for (int i = 0; i < lenout; ++i)
    {
        stop = true;
        if (this->article.length() >= prewordlen) // 如果文章長(zhǎng)度大于詞對(duì)中前綴詞的長(zhǎng)度,則直接拼接
        {
            lastword = this->article.substr(this->article.length() - prewordlen, prewordlen);//article最后的len_pre個(gè)字符,作為前綴
            for (auto &it : this->wordpairlist)
            {
                if (it.getPreword() == lastword)//通過(guò)lastword匹配詞對(duì)
                {
                    this->article += it.chooseSufword();
                    stop = false;
                    break;
                }
            }
            if (stop)//遍歷了一邊詞對(duì)的list沒(méi)有匹配的詞對(duì)時(shí),退出循環(huán)
                break;
        }
        else//啟動(dòng)詞長(zhǎng)度小于詞對(duì)前綴的情況,例如詞對(duì)分割為3+2時(shí),啟動(dòng)詞長(zhǎng)度為2,小于前綴長(zhǎng)度3,無(wú)法正常拼接,于是走此處
        {
            lastword = this->article;
            for (auto &it : this->wordpairlist)//同上遍歷
            {
                int position = it.getPreword().find(lastword);
                if (position != string::npos)
                {
                    this->article += (it.getPreword() + it.chooseSufword()).substr(position+lastword.length(), sufwordlen);//先將前后綴連接,再?gòu)钠ヅ涞降奈恢瞄_(kāi)始截取
                    stop = false;
                    break;
                }
            }
            if (stop)
                break;
        }
    }
}

4演示

4.1 wordpair(3x2), 啟動(dòng)詞(春天)

4.2 wordpair(2x1),啟動(dòng)詞(春天)

4.3 wordpair(2x2),啟動(dòng)詞(春天)

可見(jiàn),加了長(zhǎng)度限制的重要性。

5總結(jié)

目前,這個(gè)版本的處理方法不會(huì)出現(xiàn)中文亂碼,即使是中英文混合字符串也能正確讀取和分割。而且拼接時(shí)采用的隨機(jī)數(shù)策略,在語(yǔ)料庫(kù)足夠大的情況下可以有較好的靈活性。但是任然無(wú)法產(chǎn)出具備可讀性的文章。

到此這篇關(guān)于使用C++實(shí)現(xiàn)簡(jiǎn)單的文章生成器的文章就介紹到這了,更多相關(guān)C++文章生成器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語(yǔ)言實(shí)現(xiàn)鏈表與文件存取的示例代碼

    C語(yǔ)言實(shí)現(xiàn)鏈表與文件存取的示例代碼

    這篇文章主要和大家分享C語(yǔ)言實(shí)現(xiàn)鏈表與文件存取的示例代碼,可以實(shí)現(xiàn)建立鏈表,然后把鏈表數(shù)據(jù)存儲(chǔ)到文件中,然后把文件數(shù)據(jù)存儲(chǔ)到數(shù)組中并輸出,感興趣的可以學(xué)習(xí)一下
    2022-04-04
  • C語(yǔ)言題目:有多少?gòu)堊雷?-并查集

    C語(yǔ)言題目:有多少?gòu)堊雷?-并查集

    并查集是一種用于管理分組的數(shù)據(jù)結(jié)構(gòu)。它具備兩個(gè)操作:(1)查詢(xún)?cè)豠和元素b是否為同一組 (2) 將元素a和b合并為同一組,需要的朋友可以參考下
    2021-09-09
  • C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的貪吃蛇游戲的示例代碼

    C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的貪吃蛇游戲的示例代碼

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言如何實(shí)現(xiàn)經(jīng)典貪吃蛇游戲,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C語(yǔ)言有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下
    2023-01-01
  • C++ string替換指定字符實(shí)例代碼

    C++ string替換指定字符實(shí)例代碼

    這篇文章主要給大家介紹了關(guān)于C++ string替換指定字符的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C++具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • QML與C++幾種交互方式

    QML與C++幾種交互方式

    QML作為構(gòu)建界面的語(yǔ)言是非常簡(jiǎn)潔的,但是界面的后臺(tái)有些時(shí)候是經(jīng)常要與C++交互的,本文主要介紹了QML與C++幾種交互方式,感興趣的可以了解一下
    2024-04-04
  • 帶頭結(jié)點(diǎn)的鏈表的基本操作(超詳細(xì))

    帶頭結(jié)點(diǎn)的鏈表的基本操作(超詳細(xì))

    鏈表是一種動(dòng)態(tài)分配空間的存儲(chǔ)結(jié)構(gòu),能更有效地利用存儲(chǔ)空間,通過(guò)對(duì)單鏈表基本操作的代碼實(shí)現(xiàn),我深刻領(lǐng)悟到以“指針”指示元素的后繼,在插入或刪除元素時(shí)不需要移動(dòng)元素
    2023-07-07
  • c++primer類(lèi)詳解

    c++primer類(lèi)詳解

    今天小編就為大家分享一篇關(guān)于C++Primer中變量和基本類(lèi)型的文章,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2021-09-09
  • OpenCV 2.4.3 C++ 平滑處理分析

    OpenCV 2.4.3 C++ 平滑處理分析

    平滑也稱(chēng)模糊, 是一項(xiàng)簡(jiǎn)單且使用頻率很高的圖像處理方法,本文將詳細(xì)介紹OpenCV 2.4+ C++ 平滑處理,需要了解更多的朋友可以詳細(xì)參考下
    2012-11-11
  • Qt中CQGUI框架之陰影圓角窗口實(shí)現(xiàn)

    Qt中CQGUI框架之陰影圓角窗口實(shí)現(xiàn)

    這篇文章主要介紹了Qt中CQGUI框架之陰影圓角窗口實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Qt之ui在程序中的使用-多繼承法介紹

    Qt之ui在程序中的使用-多繼承法介紹

    本文將介紹Qt之ui在程序中的使用-多繼承法,需要的朋友可以參考
    2012-11-11

最新評(píng)論

北流市| 时尚| 亳州市| 宝山区| 丰原市| 巴彦县| 临城县| 红桥区| 赣州市| 庆阳市| 巫山县| 山西省| 泸溪县| 屯昌县| 赤峰市| 琼中| 固阳县| 灯塔市| 玉环县| 葵青区| 中超| 岳西县| 崇仁县| 太湖县| 股票| 赫章县| 涡阳县| 交口县| 辉县市| 文成县| 曲水县| 涡阳县| 峨眉山市| 沂南县| 房山区| 公安县| 曲松县| 历史| 洪泽县| 蒙城县| 胶南市|