Compare commits

..

4 Commits

Author SHA1 Message Date
ArvinLovegood
483ffa2244 feat(data): 优化金融分词词典与情感分析逻辑
- 更新基础词典文件,完善覆盖场景并调整部分词条权重
- 移除重复或冗余的美股及中概股名称条目
- 提升多个关键金融术语如“人工智能”、“半导体”等权重至350
- 新增“冲高”、“打开涨停”等交易行为相关词汇并设定合理权重
- 完善“十五五规划”相关内容条目,并分类整理结构
- 在情感分析模块引入basefreq常量替代硬编码数值
- 调整股票名称和板块名称添加逻辑中的频率值计算方式
- 重构用户自定义词典加载流程,增强兼容性和健壮性
- 支持更灵活的用户词典格式(支持词、频、词性三元素)
- 修改词频结果结构体,新增Score字段用于综合评分
- 优化排序规则,依据频率与权重乘积进行降序排列
- 增加调试日志输出,便于追踪分析过程与结果
- 前端Treemap图表展示逻辑同步更新以适配新的评分标准
2025-11-22 17:17:55 +08:00
ArvinLovegood
63d278b9aa feat(stock):加载用户自定义词典进行情感分析(用户可以自己定义词典调整热词权重)
- 在默认词典加载成功后,增加加载用户自定义词典逻辑
- 判断用户词典文件是否存在,避免加载空文件
- 记录用户词典加载成功或失败的日志信息
- 保持原有默认词典加载流程不变
- 确保词典加载错误不会中断程序运行
- 统一词典加载后的日志输出格式
2025-11-22 13:02:33 +08:00
ArvinLovegood
5621d40c71 feat(market):调整词频树图数据计算方式
- 将词频树图中的值计算方式从 Frequency 改为 Frequency * Weight
- 更新 treemap 数据映射逻辑以反映新的权重计算
- 确保前端展示的数据更加准确地反映词汇的重要性
2025-11-22 12:58:41 +08:00
ArvinLovegood
26e9753b94 feat(data):添加十五五规划重点领域关键词到基础词典
- 新增涵盖七个大类的政策关键词汇
- 设置词汇权重范围为310-350,适配政策资讯分词场景
- 包含核心战略方向、科技创新与数字经济等领域术语
- 添加能源与绿色转型相关高频词汇
- 补充高端制造与新兴产业的专业表达
- 增加乡村振兴与农业现代化关键词
- 纳入对外开放与贸易升级术语
- 更新社会民生与公共服务领域用词
2025-11-22 12:55:11 +08:00
4 changed files with 168 additions and 82 deletions

View File

@@ -1,6 +1,6 @@
# 金融股票全场景分词字典(去重优化版)
# 金融股票全场景分词字典(最终去重优化版)
# 格式:单词 权重 词性 | 权重280-350分核心术语优先匹配无重复词汇
# 覆盖:净买卖、股指、财务指标、交易操作、政策宏观、热点概念等全场景
# 覆盖:净买卖、股指、财务指标、交易操作、政策宏观、热点概念、机构媒体、美股中概股、十五五规划等全场景
# 一、净买卖与资金流向(核心交易表述)
净卖出 340 v
@@ -137,13 +137,6 @@ Russell 2000 310 n
纽约证交所综合指数 310 n
NYSE Composite 300 n
纳斯达克中国金龙指数 310 n
英伟达 300 n
苹果 300 n
谷歌 300 n
蔚来 300 n
雅虎 300 n
中概股 300 n
雅虎财经 300 n
# 欧洲市场
德国DAX指数 330 n
DAX 30 320 n
@@ -206,8 +199,8 @@ G20国家指数 300 n
# 四、A股龙头公司资讯高频
贵州茅台 310 n
宁德时代 310 n
比亚迪 300 n
宁德时代 350 n
比亚迪 340 n
隆基绿能 300 n
长江电力 290 n
中国平安 300 n
@@ -223,7 +216,7 @@ G20国家指数 300 n
东方财富 290 n
爱尔眼科 290 n
通威股份 290 n
药明康德 290 n
药明康德 320 n
阳光电源 290 n
天齐锂业 290 n
赣锋锂业 290 n
@@ -359,21 +352,21 @@ RQFII 290 n
# 八、热点概念与行业
AI 330 n
人工智能 330 n
人工智能 350 n
算力 330 n
大数据 320 n
云计算 320 n
半导体 320 n
芯片 320 n
集成电路 310 n
新能源 320 n
光伏 320 n
半导体 350 n
芯片 350 n
集成电路 340 n
新能源 350 n
光伏 340 n
锂电 320 n
储能 320 n
储能 340 n
充电桩 310 n
新能源车 320 n
智能汽车 310 n
自动驾驶 310 n
自动驾驶 330 n
军工 310 n
国防军工 300 n
医药 310 n
@@ -390,16 +383,16 @@ CXO 300 n
房地产 300 n
基建 300 n
新基建 310 n
数字经济 320 n
数字经济 350 n
数字货币 310 n
区块链 300 n
元宇宙 300 n
低空经济 310 n
人形机器人 310 n
工业互联网 300 n
低空经济 340 n
人形机器人 330 n
工业互联网 330 n
物联网 300 n
5G 300 n
6G 300 n
6G 340 n
# 九、交易操作与行情
上涨 310 v
@@ -449,8 +442,8 @@ CXO 300 n
跌停板 300 n
一字涨停 290 n
一字跌停 290 n
打开涨停 280 v
打开跌停 280 v
打开涨停 320 v
打开跌停 320 v
集合竞价 290 n
连续竞价 280 n
开盘价 340 n
@@ -465,8 +458,6 @@ CXO 300 n
跌幅 340 n
涨停价 330 n
跌停价 330 n
打开涨停 320 v
打开跌停 320 v
熔断 330 n
临时停牌 320 n
复牌 320 v
@@ -552,9 +543,9 @@ H股 310 n
创业板 320 n
科创板 320 n
主板 320 n
纳斯达克 310 n
纳斯达克 350 n
纽交所 310 n
标普500 310 n
标普500 350 n
道琼斯 310 n
成分股 310 n
权重股 310 n
@@ -603,6 +594,7 @@ RSI 310 n
跌破 310 v
站稳 310 v
回落 310 v
冲高 310 v
横盘整理 310 n
震荡整理 310 n
洗盘 310 n
@@ -649,10 +641,9 @@ Level-2行情 300 n
抱团股 310 n
妖股 310 n
庄股 310 n
# 主要财经网站与机构名词(格式:单词 权重 词性)
# 权重320-350分与核心金融术语优先级一致确保精准识别
# 一、国内财经网站(资讯高频来源)
# 一、主要财经网站与机构
# 国内财经网站
东方财富网 350 n
同花顺财经 340 n
财新网 340 n
@@ -673,8 +664,7 @@ Level-2行情 300 n
腾讯财经 320 n
网易财经 320 n
凤凰财经 320 n
# 二、国际财经媒体(全球市场资讯来源)
# 国际财经媒体
彭博社 350 n
路透社 350 n
金融时报 340 n
@@ -687,8 +677,7 @@ CNBC 320 n
美国消费者新闻与商业频道 320 n
日经新闻 320 n
韩国经济新闻 310 n
# 三、国际金融机构(投行/基金/银行)
# 国际金融机构
高盛集团 350 n
摩根士丹利 350 n
摩根大通 350 n
@@ -705,14 +694,12 @@ CNBC 320 n
瑞士信贷 320 n
法国巴黎银行 320 n
三菱日联金融集团 310 n
# 四、国内外金融监管与交易机构
# 国内外金融监管与交易机构
中国证监会 350 n
美联储 350 n
英国金融行为管理局 330 n
香港证监会 330 n
纽约证券交易所 350 n
纳斯达克 350 n
香港交易所 340 n
伦敦证券交易所 340 n
芝商所集团 330 n
@@ -730,8 +717,7 @@ CNBC 320 n
美国能源信息署 320 n
世界银行 330 n
国际货币基金组织 330 n
# 五、国内核心金融机构(券商/基金/银行)
# 国内核心金融机构
中国工商银行 340 n
中国建设银行 340 n
中国农业银行 340 n
@@ -752,10 +738,9 @@ CNBC 320 n
华夏基金 330 n
嘉实基金 320 n
博时基金 320 n
# 知名美股与中概股Jieba格式词汇 权重 词性)
# 权重320-350分核心龙头股优先级最高适配资讯分词场景
# 、知名美股(科技、消费、金融龙头)
# 十二、知名美股与中概股
# 知名美股
苹果 350 n
Apple 340 n
英伟达 350 n
@@ -800,16 +785,9 @@ PepsiCo 290 n
Walmart 300 n
家得宝 300 n
Home Depot 290 n
摩根大通 320 n
JPMorgan Chase 310 n
高盛 320 n
Goldman Sachs 310 n
摩根士丹利 320 n
Morgan Stanley 310 n
美国银行 310 n
Bank of America 300 n
# 二、知名中概股(互联网、新能源、金融、医药龙头)
# 知名中概股
阿里巴巴 350 n
Alibaba 340 n
拼多多 340 n
@@ -890,17 +868,13 @@ Megvii 290 n
Cloudwalk 290 n
依图科技 300 n
Yitu 290 n
药明康德 320 n
WuXi AppTec 310 n
药明生物 320 n
WuXi Biologics 310 n
康希诺 310 n
CanSino Biologics 300 n
智飞生物 310 n
Innovax 300 n
宁德时代 350 n
CATL 340 n
比亚迪 340 n
BYD 330 n
小鹏汽车 330 n
Xpeng 320 n
@@ -923,4 +897,86 @@ OnePlus 300 n
真我 310 n
realme 300 n
传音控股 310 n
Transsion 300 n
Transsion 300 n
# 十三、十五五规划重点领域
# 核心战略方向
新质生产力 350 n
科技自立自强 350 n
全要素生产率 340 n
高质量发展 340 n
中国式现代化 340 n
共同富裕 330 n
区域协调发展 330 n
城乡融合发展 330 n
国家安全体系 330 n
双循环 330 n
高水平对外开放 320 n
# 科技创新与数字经济
量子科技 340 n
脑机接口 340 n
具身智能 340 n
第六代移动通信 340 n
生成式AI 340 n
通用人工智能 330 n
工业母机 340 n
集成电路 340 n
高端算力 330 n
数据要素 340 n
数字基础设施 330 n
智能制造 340 n
服务型制造 320 n
绿色制造 320 n
# 能源与绿色转型
新型能源体系 340 n
氢能 340 n
核聚变能 330 n
可再生能源 330 n
风电 330 n
生物质能 320 n
碳排放双控 340 n
碳达峰 330 n
碳中和 330 n
绿色低碳 330 n
循环经济 320 n
节能环保 320 n
碳交易 320 n
# 高端制造与新兴产业
航空航天 340 n
新材料 340 n
生物制造 330 n
生物医药 330 n
基因编辑 320 n
合成生物学 320 n
智能网联汽车 330 n
机器人 330 n
海洋工程 320 n
核电 320 n
高端装备 330 n
# 乡村振兴与农业现代化
乡村振兴 340 n
农业机械化 330 n
智慧农业 330 n
现代农业 320 n
粮食安全 330 n
农产品深加工 320 n
农村电商 320 n
乡村旅游 310 n
# 对外开放与贸易升级
跨境电商 330 n
自贸试验区 320 n
海南自贸港 320 n
一带一路 330 n
服务贸易 320 n
数字贸易 320 n
跨境金融 320 n
外资准入 310 n
# 社会民生与公共服务
教育强国 320 n
健康中国 320 n
养老服务 310 n
医疗保障 310 n
保障性住房 310 n
公共卫生 320 n
文化强国 320 n
体育强国 310 n

View File

@@ -13,11 +13,14 @@ import (
"strings"
"unicode"
"github.com/duke-git/lancet/v2/convertor"
"github.com/duke-git/lancet/v2/fileutil"
"github.com/duke-git/lancet/v2/strutil"
"github.com/go-ego/gse"
)
const basefreq float64 = 100
// 金融情感词典,包含股票市场相关的专业词汇
var (
seg gse.Segmenter
@@ -70,11 +73,11 @@ var zhDict string
func InitAnalyzeSentiment() {
logger.SugaredLogger.Infof("初始化词典库路径:%s", fileutil.CurrentPath())
//加载默认词典
err := seg.LoadDictEmbed(zhDict)
err = seg.LoadDictEmbed(baseDict)
err := seg.LoadDictEmbed(baseDict)
if err != nil {
logger.SugaredLogger.Error(err.Error())
} else {
logger.SugaredLogger.Info("加载默认词典成功")
}
stocks := &[]StockBasic{}
db.Dao.Model(&StockBasic{}).Find(stocks)
@@ -82,9 +85,9 @@ func InitAnalyzeSentiment() {
if strutil.Trim(stock.Name) == "" {
continue
}
err := seg.AddToken(stock.Name, 188888, "n")
err := seg.AddToken(stock.Name, basefreq+500, "n")
if strutil.Trim(stock.BKName) != "" {
err = seg.AddToken(stock.BKName, 188888, "n")
err = seg.AddToken(stock.BKName, basefreq+500, "n")
}
if err != nil {
logger.SugaredLogger.Errorf("添加%s失败:%s", stock.Name, err.Error())
@@ -96,9 +99,9 @@ func InitAnalyzeSentiment() {
if strutil.Trim(stock.Name) == "" {
continue
}
err := seg.AddToken(stock.Name, 188888, "n")
err := seg.AddToken(stock.Name, basefreq+500, "n")
if strutil.Trim(stock.BKName) != "" {
err = seg.AddToken(stock.BKName, 188888, "n")
err = seg.AddToken(stock.BKName, basefreq+500, "n")
}
if err != nil {
logger.SugaredLogger.Errorf("添加%s失败:%s", stock.Name, err.Error())
@@ -115,13 +118,40 @@ func InitAnalyzeSentiment() {
tags := &[]models.Tags{}
db.Dao.Model(&models.Tags{}).Find(tags)
for _, tag := range *tags {
err := seg.AddToken(tag.Name, 188888, "n")
err := seg.AddToken(tag.Name, basefreq, "n")
if err != nil {
logger.SugaredLogger.Errorf("添加%s失败:%s", tag.Name, err.Error())
}
}
logger.SugaredLogger.Info("加载词典成功")
//加载用户自定义词典 先判断用户词典是否存在
if fileutil.IsExist(fileutil.CurrentPath() + "/data/dict/user.txt") {
lines, err := fileutil.ReadFileByLine(fileutil.CurrentPath() + "/data/dict/user.txt")
if err != nil {
logger.SugaredLogger.Error(err.Error())
return
}
for _, line := range lines {
k := strutil.SplitAndTrim(line, " ")
switch len(k) {
case 1:
err = seg.AddToken(k[0], 100)
case 2:
freq, _ := convertor.ToFloat(k[1])
err = seg.AddToken(k[0], freq)
case 3:
freq, _ := convertor.ToFloat(k[1])
err = seg.AddToken(k[0], freq, k[2])
default:
logger.SugaredLogger.Errorf("用户词典格式错误:%s", line)
}
}
if err != nil {
logger.SugaredLogger.Error(err.Error())
} else {
logger.SugaredLogger.Error("加载用户词典成功")
}
}
}
// WordFreqWithWeight 词频统计结果,包含权重信息
@@ -129,14 +159,16 @@ type WordFreqWithWeight struct {
Word string
Frequency int
Weight float64
Score float64
}
// getWordWeight 获取词汇权重
func getWordWeight(word string) float64 {
// 从分词器获取词汇权重
freq, pos, _ := seg.Find(word)
if pos == "n" {
return freq
freq, pos, ok := seg.Dictionary().Find([]byte(word))
if ok && pos == "n" {
return basefreq + freq
}
return 0
}
@@ -149,13 +181,11 @@ func SortByWeightAndFrequency(frequencies map[string]WordFreqWithWeight) []WordF
freqSlice = append(freqSlice, freq)
}
// 按权重降序排列,如果权重相同则按频次降序排列
// 按权重*频次降序排列
sort.Slice(freqSlice, func(i, j int) bool {
if freqSlice[i].Weight != freqSlice[j].Weight {
return freqSlice[i].Weight > freqSlice[j].Weight // 权重高的排前面
}
return freqSlice[i].Frequency > freqSlice[j].Frequency // 权重相同时频次高的排前面
return freqSlice[i].Weight*float64(freqSlice[i].Frequency) > freqSlice[j].Weight*float64(freqSlice[j].Frequency)
})
logger.SugaredLogger.Infof("排序后的结果:%v", freqSlice)
return freqSlice
}
@@ -228,11 +258,12 @@ func countWordFrequencyWithWeight(text string) map[string]WordFreqWithWeight {
// 构建包含权重的结果
for word, frequency := range wordCount {
weight := getWordWeight(word)
if weight > 100 {
if weight > 0 {
freqMap[word] = WordFreqWithWeight{
Word: word,
Frequency: frequency,
Weight: weight,
Score: float64(frequency) * weight,
}
}

View File

@@ -26,11 +26,10 @@ func TestAnalyzeSentiment(t *testing.T) {
text := messageText.String()
text = " 【周六你需要知道的隔夜全球要闻:美联储鸽声重振 美股走势回稳】 1、纽约联储行长威廉姆斯表示随着劳动力市场走软美联储近期内仍有再次降息的空间。 2、美联储理事斯蒂芬·米兰表示自上次联邦公开市场委员会FOMC会议以来的经济数据应“促使人们偏向鸽派立场”。 3、波士顿联邦储备银行行长柯林斯表示由于通胀可能在一段时间内保持高位维持利率不变“目前合适”。 4、据CME“美联储观察”截至北京时间11月22日6时30分美联储12月降息25个基点的概率为69.4%维持利率不变的概率为30.6%。 5、美国劳工统计局表示11月CPI报告将于12月18日发布同时取消了10月CPI报告发布表示无法追溯采集政府停摆期间未能收集的部分数据。 6、俄罗斯总统普京表示已收到美提出解决俄乌冲突的计划俄罗斯愿意进行和平谈判。美国总统特朗普表示他认为27日是乌克兰接受美国支持的和平计划的最后期限。 7、美联储高官鸽派言论提振市场情绪美股三大指数收盘集体上涨道琼斯指数涨1.08%标普500指数涨0.98%纳斯达克综合指数涨0.88%。甲骨文跌超5%英伟达跌超1%。纳指本周累计跌2.74%标普500指数累跌1.95%道指累跌1.91%。英伟达本周累跌5.9%。 8、热门中概股多数上涨纳斯达克中国金龙指数收涨1.23%。蔚来涨超3%哔哩哔哩、理想汽车涨超2%京东、小鹏汽车涨超1%。 9、国际油价下跌交易员评估乌克兰与俄罗斯可能达成和平协议的前景。WTI 1月期货下跌1.6%结算价报每桶58.06美元为过去五个交易日中第四次下跌。布伦特1月期货下跌1.3%结算价报每桶62.56美元。 10、美联储延长压力测试改进方案征询期为银行反馈提供更多时间。 11、由于美国人对个人财务状况的看法恶化美国消费者信心在11月跌至接近纪录最低水平密歇根大学数据显示11月消费者信心指数降至5110月为53.6。 12、日本央行政策委员会委员Kazuyuki Masu表示日本央行接近作出加息决定。 13、穆迪将意大利信用评级从BAA3上调至BAA2展望稳定。\n"
text = "财联社电英伟达周五冲高回落股价涨幅收于1%,市场普遍认为其走势疲软"
// 分析情感
words := splitWords(text)
fmt.Println(strings.Join(words, " "))
result := AnalyzeSentiment(text)
result, frequencies := AnalyzeSentimentWithFreqWeight(text)
// 过滤标点符号和分隔符
cleanFrequencies := FilterPunctuationAndSeparators(frequencies)

View File

@@ -179,7 +179,7 @@ function Analyze(){
treemapchart = echarts.init(treemapRef.value);
treemapchart.showLoading()
AnalyzeSentimentWithFreqWeight("").then((res) => {
console.log(res)
let option = {
legend: {
show: false
@@ -187,9 +187,9 @@ function Analyze(){
series: [
{
type: 'treemap',
data: res['frequencies'].slice(0, 20).map(item => ({
data: res['frequencies'].map(item => ({
name: item.Word,
value: item.Frequency,
value: item.Score,
}))
}
]