基于古诗词的名字生成器

article/2025/9/9 8:21:02

数据集

因为数据量庞大,使用本地的 CSV 数据进行测试。

后续改进 CSV 文件保存到 mongodb 数据库,便于聚合查询。

数据分词

我们需要一个分词器将这些数据进行分词,用到的是 Golang 版的 jieba 库如下:

"github.com/go-ego/gse"

最理想的分词器是将长短句中的名词进行提取,本 demo 使用自带的分词器。根据官方示例进行数据分词:

package utilimport ("flag""fmt""log""os""regexp""github.com/go-ego/gse""github.com/go-ego/gse/hmm/idf""github.com/go-ego/gse/hmm/pos"
)var (seg    gse.SegmenterposSeg pos.Segmenter)// 分词库初始化
func init() {// Loading the default dictionaryerr := seg.LoadDict()// Loading the default dictionary with embed//err := seg.LoadDictEmbed()// Loading the traditional chinese dictionary//err := seg.LoadDict("zh_t")// 加载停用词//err := seg.LoadDict("../data/stopwords/baidu_stopwords.txt")//err := seg.LoadDict("../data/stopwords/cn_stopwords.txt")//err := seg.LoadDict("../data/stopwords/hit_stopwords.txt")//err := seg.LoadDict("../data/stopwords/scu_stopwords.txt")if err != nil {log.Println(err)return}
}func GetName(t string) {//cut := seg.Cut(t)cut := seg.CutSearch(t, true)cut = seg.Trim(cut)fmt.Println("cut all: ", cut)saveAsFile("NameArray.txt", cut)
}func saveAsFile(fileName string, data []string) {fp, _ := os.OpenFile(fileName, os.O_CREATE|os.O_APPEND|os.O_RDWR, os.ModeAppend|os.ModePerm) // 读写方式打开defer fp.Close()for _, v := range data {fp.WriteString(v + "\n")}
}

以上代码包括的官方示例和根据示例进行数据的分词,将分词结果保存为 txt 文件:

以回车符为标志,保存分词结果,是为了后续能够随机地取单词,通过行数的随机数生成,就可以随机读取单词,达到随机取词效果。

随机参数

根据时间种子进行随机数生成,返回十个随机单词:

package utilimport ("bufio""io""log""math/rand""os""time"
)func GenerateName() {// 时间戳作为随机种子rand.Seed(time.Now().Unix())//getNameFile("../test/NameArray.txt")for i := 0; ; {random := rand.Intn(16497)name := ReadLine("../test/NameArray.txt", random, 3*2)if len(name) > 0 {log.Println(name)i++if i > 10 {break}}}
}func ReadLine(fileName string, lineNumber, length int) string {file, _ := os.Open(fileName)fileScanner := bufio.NewScanner(file)lineCount := 1for fileScanner.Scan() {if lineCount == lineNumber {name := fileScanner.Text()if len(name) == length {return name} else {//log.Println(fileScanner.Text(), len(fileScanner.Text()), length)return ""}break}lineCount++}defer file.Close()return ""
}func getNameFile(fileName string) {fp, e := os.OpenFile(fileName, os.O_RDONLY, 0644)if e != nil {log.Println(e)}defer fp.Close()//读入缓存buff := bufio.NewReader(fp)for {//以'\n'为结束符读入一行line, e := buff.ReadString('\n')if e != nil || io.EOF == e {log.Println(e)break}log.Println(line)}
}

2022/05/04 17:17:40 绿波
2022/05/04 17:17:40 吹愁
2022/05/04 17:17:40 出于
2022/05/04 17:17:40 城中
2022/05/04 17:17:40 江山
2022/05/04 17:17:40 九十
2022/05/04 17:17:40 天涯
2022/05/04 17:17:40 燕尾
2022/05/04 17:17:40 草色
2022/05/04 17:17:40 绿水
2022/05/04 17:17:40 心上

由输出结果可见,分词结果和随机参数效果并不是很好,需要后续改进。

分词改进

func GetName(t string) {po := seg.Pos(t, true)//fmt.Println("pos: ", po)po = seg.TrimWithPos(po, "zg", "x", "v", "i", "c", "r", "l")//po = seg.TrimWithPos(po, "zg", "x", "v")//fmt.Println("trim pos: ", po)var cut []stringfor _, v := range po {if len(v.Text) > 6 {//log.Println(v.Text, v.Pos)} else {log.Println(v.Text, v.Pos)cut = append(cut, v.Text)}}//cut := seg.Cut(t)//cut := seg.CutSearch(t, true)//cut = seg.Trim(cut)//fmt.Println("cut all: ", cut)saveAsFile("NameArray.txt", cut)}

使用 TrimWithPos 剔除一些特殊的词语,尽量保留名词,效果如下:

  


http://chatgpt.dhexx.cn/article/Z9tPdUNp.shtml

相关文章

基于LSTM + keras 的古诗生成器

1.语料准备:包含 5.5 万首唐诗、26 万首宋诗、2.1 万首宋词和其他古典文集。诗人包括唐宋两朝近 1.4 万古诗人,和两宋时期 1.5 千古词人。数据来源于互联网。每行一首诗,标题在预处理的时候已经去掉了。2.模型参数配置:预先定义模…

唐诗生成器

使用唐诗语料库,经过去噪预处理、分词、生成搭配、生成主题等过程,生成唐诗。 csdn下载地址:http://download.csdn.net/detail/lijiancheng0614/9840952 github上repository地址:https://github.com/lijiancheng0614/poem_genera…

JQuery中的val()函数

JQuery中的val()函数相当于Javascript中的value属性,可以用来设置和获取元素的值。 下面用一个简单的邮箱登陆界面来举个例子: 在默认情况下邮箱的地址输入框和密码输入框都有相应的提示。 要求:当鼠标聚焦在邮箱地址输入框时,提…

【Python】sklearn中的cross_val_score()函数参数

sklearn 中的cross_val_score函数可以用来进行交叉验证,因此十分常用,这里介绍这个函数的参数含义。 sklearn.cross_validation.cross_val_score(estimator, X, yNone, scoringNone, cvNone, n_jobs1, verbose0, fit_paramsNone, pre_dispatch‘2*n_job…

sklearn交叉验证函数cross_val_score用法及参数解释

文章目录 一 、使用示例二、参数含义三、常见的scoring取值1.分类、回归和聚类scoring参数选择2.f1_micro和f1_macro区别3.负均方误差和均方误差 一 、使用示例 import numpy as np from sklearn.model_selection import train_test_split from sklearn import svm from sklea…

java val_Java中是否有val()函数?

慕尼黑的夜晚无繁华 很少有实际用例能够评估String作为Java代码的一个片段是必要的或可取的。也就是说,询问如何做到这一点实际上是XY问题:你实际上有一个不同的问题,可以用不同的方法来解决。先问问自己,这是怎么回事String你想要…

c语言val函数用法,函数VAL()什么意思怎么用啊?/

满意答案 Dickyshe 2013.03.22 采纳率:50% 等级:12 已帮助:12551人 将一个数据行变量转换成数字长整型变量如 text1.text "10" text2.text "11" text3.text text1.texttext2.text 按道理应该得到10+11(…

mysql中val是什么意思_val是什么函数

val是将由数字符号组成的字符型数据转换成相应的数值型数据的函数,其语法是“Val(S,V,Code)”,若字符串内出现非数字字符,那么只转换非数字字符前面的部分;若字符串的首字符不是数字符号,则返回数值零,但忽…

抽象方法的访问修饰符

抽象方法不能使用private修饰符,也不宜使用默认修饰符(default) (1)如果使用private修饰符 public abstract class SuperClass {/** The abstract method test in type SuperClass can only set a visibility modifi…

Java之访问修饰符

1.访问修饰符 java提供四种访问修饰符,用于控制方法和属性(成员变量)的访问权限 四种分别是 公开级别:public,对外公开 受保护级别:protected,对子类和同一个包的类公开 默认级别&#xff…

Java-访问修饰符

目录 一、private(私有权限) 二、default(默认权限) 三、protected(受保护权限) ​四、public(公共权限) 五、总结 示意图 private(default)protectedpublic本类YesYesYesYes同包的类NoYesYesYes不同包的父子关系NoNoYesYes不同包的非父子关系NoNoNoYes 注意点&#xf…

C# 的访问修饰符

访问修饰符的作用域分为三种: 类的访问修饰符方法的访问修饰符属性的访问修饰符 访问修饰符主要分为: public (公共的)protected (保护的)internal (内部的)private (私有的) 一,类的访问修饰符 默认的是 internal 二,方法的…

c# 访问修饰符

C# 中提供了 6 种访问修饰符:public、private、protected、internal、protected internal、private protected。   访问修饰符 在所有的类型和类型成员中都具有可访问性级别,用于控制是否可以从程序集或其他程序集中对其他代码的访问控制。 访问修饰符…

访问控制修饰符

定义理解 对类、变量、方法、接口的访问范围限制。一.类修饰符 1.直接声明 class 类名{ },即不加修饰符的时候 这种情况下,只可访问同一包中的类,不可访问不同包中的类。2.public,公共类的修饰符 这种情况下,既可访…

Java访问修饰符全面详细介绍

Java中有四种权限修饰符,其在同一项目中所对应的访问权限如下: 注意:默认不写即是default,而不是自己还特意加上default关键字。 Java语言有4种访问权限修饰符,下面按照权限从小到大的顺序对4种访问权限分别介绍: 1、…

Java基础:Java中四种访问修饰符

一、背景。 这篇文章主要介绍了Java中四种访问修饰符详细教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下。放假在家里休息,闲来无事,想巩固巩固自己的基础知识…

C#的5种访问修饰符

C#的5种访问修饰符 1、public 公共的 public 允许一个类将其成员变量和成员函数暴露给其他的函数和对象。任何公有成员都可以被外部的类访问。 class Person {public string name;public int age;public void SayHello(){Console.WriteLine("大家好,我叫{0}&a…

C#访问修饰符

C#中的访问修饰符有以下六种: public:同一程序集和和引用该程序集的所有代码都可访问。public成员可访问级别由该类型本身的级别决定。private:只有同一类中的成员可以访问protected:同一类和派生类中的代码可以访问internal&…

java的四个访问修饰符_Java中的四种访问修饰符

Java中修饰符分为两种:访问修饰符和非访问修饰符。修饰符中,有一些修饰符可以既可以修饰类,也可以修饰方法,但是有一些修饰符只能修饰符方法。 今天这篇文章先介绍一下四种访问修饰符。 1、private修饰符 private表示私有的。既然…