1.Python 结巴分词(jieba)源码分析
2.五穷六绝七翻身?量化分析揭开背后真相(附源码)
3.jieba源码解析(一)——中文分词
4.使用 Elasticsearch 和 LlamaIndex 进行高级文本检索:句子窗口检索
Python 结巴分词(jieba)源码分析
本文深入分析Python结巴分词(jieba)的源码,旨在揭示其算法实现细节与设计思路,码收以期对自然语言处理领域感兴趣的句收集源集句朋友提供有价值的参考。经过两周的码收细致研究,作者整理了分词算法、句收集源集句实现方案及关键文件结构的码收q绑查询小工具源码解析,以供读者深入理解结巴分词的句收集源集句底层逻辑。
首先,码收分词算法涉及的句收集源集句核心技术包括基于Trie树结构的高效词图扫描、动态规划查找最大概率路径和基于HMM模型的码收未登录词处理。Trie树用于生成句子中所有可能成词情况的句收集源集句有向无环图(DAG),动态规划则帮助在词频基础上寻找到最优切分组合,码收而HMM模型则通过Viterbi算法处理未在词库中出现的句收集源集句词语,确保分词的码收准确性和全面性。
在结巴分词的句收集源集句文件结构中,作者详细介绍了各个关键文件的功能与内容。dict.txt作为词库,记录着词频与词性信息;__init__.py则是核心功能的入口,提供了分词接口cut,支持全模式、精确模式以及结合最大概率路径与HMM模型的综合模式。全模式下,会生成所有可能的词组合;精确模式通过最大概率路径确定最优分词;综合模式则同时考虑概率与未登录词,以提高分词效果。
实现细节方面,文章通过实例代码解释了全模式、精确模式及综合模式的分词逻辑。全模式直接输出所有词组合;精确模式基于词频和最大概率路径策略,高效识别最优分词;综合模式利用HMM模型处理未登录词,进一步提升分词准确度。通过生成的DAG图,直观展示了分词过程。
结巴分词的代码实现简洁而高效,通过巧妙的算法设计和数据结构应用,展示了自然语言处理技术在实际应用中的强大能力。通过对分词算法的深入解析,不仅有助于理解结巴分词的香草论坛源码功能实现,也为自然语言处理领域的研究与实践提供了宝贵的洞察。
五穷六绝七翻身?量化分析揭开背后真相(附源码)
六月悄然离去,留下了鲜绿色的回忆。七月的第一交易日即将来临,不用想,不用猜,投资群中的人们纷纷谈论着那句耳熟能详的股市谚语,相互取暖,相互打气。
这句谚语就是“五穷六绝七翻身”,虽然不能说每个人都耳熟能详,但肯定都略有耳闻。从字面上就能看出,说的是股市每逢每年的五月和六月都会出现下跌,到了七月,下跌趋势终止,开始回升走出低谷,打一个漂亮的翻身仗。
目前主流观点认为,这种说法最早起源于香港股市,在上世纪年代至年代的时候港岛特别流行,据说当时的经济研究员参考过历年香港股市的涨跌情况后,统计总结得出的结论。
类似的说法,不单单中国股市有,国外股市也存在,最著名的莫过于美国华尔街流传已久的“Sell in May”(在五月份卖出),但最早的出处却是在英国。完整的句子应该是“Sell in May and go away, come back at St.Leger's Day”,St.Leger's Day指的就是英国每年九月份在南约克郡举行的秋季赛马比赛。所以整句话翻译过来就是说,在五月份的时候大家都要卖出清仓离开,等到秋季赛马比赛后再回来。
为啥要在五月份离开呢?因为夏天到了太热了,离开伦敦去避暑,就跟清朝皇帝一到夏天就跑到承德避暑山庄消夏一样,andlua源码网站等到秋天转凉了再屁颠屁颠跑回来。所以嘛,那群英国贵族、银行家和投资家都跑出去避暑了,清仓不玩了,那时候还没现在远程炒股的便利,股市可不就冷清没有行情嘛,等到他们九月末回来之后,行情才会有起色。后来这句话被投资者们念叨着跨过大西洋,带到了北美大陆,成为了如今华尔街金融人士口口相传的一句谚语。
同样都是五月卖出/下跌,一个来自于香港,一个来自于英美,那跟我国的大A行情规律吻合吗?今年大盘五月份跌了3.%,六月份跌了0.%,真的是又穷又绝,接下来的一个月我们能翻身不?
要看我国股市符不符合“五穷六绝七翻身”这个规律,靠瞎说可不行,要有数据统计结果,邓爷爷教育道“实践是检验真理的唯一标准”,我们就撸起袖子开干。
要总结规律,那数据时间范围当然越长越好,挑来挑去,觉得还是先选择“上证指数”较为合适,它在年就发布了(沪深指数还要年后才发布),基本跟上交所深交所同龄,数据长度够长,基本全覆盖了A股发展历程,更何况股民日常说的点、点什么的,指的就是上证指数的点位。
首先我们就来获取上证指数的历史行情数据,这里使用的说说采集源码是股票量化开源库qstock,直接使用“pip install qstock”就可以安装,基本的功能无需注册便可以使用,对新手来说非常方便,详情请见:github.com/tkfy/qsto...
在这里我们就获取了上证指数从年6月至年6月的全部月度行情数据,结合当月的收盘价和上个月的收盘价(close)就可以计算出当月的涨跌幅(pct),为了方便后续统计,我们还需要将日期索引(date,对应的是每个月的最后交易日)转换为对应的月份数值(month)。
至此,我们就获取到了年7月至年6月这年之间每个月的涨跌幅数据,这样的日期范围设置的原因是,平衡每个月份数的分布,保证每个月都出现的次数相同,都是次。
数据整理完毕后,就可以开始统计了,在这里我们要统计的是每个月的上涨次数(win_num)、下跌次数(lose_num)、胜率(win_rate)、涨跌幅的均值(pct_avg)、涨跌幅的中位数(pct_med)、涨跌幅的最小值(pct_min)和涨跌幅的最大值(pct_max)。
实现的原理是,按月份数值(month)进行循环,分月份进行统计,那每一个月份就有个涨跌幅(pct)数值,若涨跌幅为正数记为上涨,负数记为下跌,胜率(单位百分比)则为“*上涨次数/”,其余的4个指标就分别对应着这个涨跌幅数值序列当中的均值、中位数、最小值和最大值,具体细节请看下方代码。
现在统计结果就一目了然了,五月份和六月份的胜率都是五五开,年里面涨跌都是unity引起 源码各有次,而七月份上涨次数只有次,再看涨跌幅均值,这3个月份的涨跌幅均值分别为5.%、-0.%和-0.%,而且七月份的涨跌幅均值是一年个月里面最差的,涨跌幅中位数也是。
因此结果显而易见,无论从胜率,还是涨跌幅均值/中位数,七月份都要比五月份和六月份的差,如果还要坚持说五六月份还是“五穷六绝”的话,那整句话就该改为“五穷六绝七地狱”,地狱还可能是十八层的那种。
为了降低选择代表性指数时的片面性,我们把市场上主流的那几个指数都逐个统计一遍,只要把第一段代码中的变量symbol再分别逐次修改为深证成指、上证、沪深、中证、中证、创业板指和中证全指,时间范围也做对应的调整,挨个重新run一遍,就可以统计出相应指数的月份涨跌幅数据,每次的统计结果都会保存为以指数名称为文件名后缀的Excel文件,汇总这些统计文件,就可以看到所有指数的全貌,统计结果如下所示。
主流指数所有月份胜率数据表:
主流指数所有月份涨跌幅均值数据表:
从胜率表当中看出,五六七月份的总体胜率均值分别是.2%、.%和.%,七月份并没有好于五六月份;五六七月份的总体涨跌幅均值分别是2.%、-0.%和1.%,虽然七月份翻身了一丢丢,但也没有体现出“五穷”的赶脚,综上所述,至少在主流指数概况当中,“五穷六绝七翻身”这种说法并不成立,根本站不住脚,今年的七月翻身仗,翻不翻得了基本是五五开,但从总体涨跌幅均值来看,还是“优势在我”。
论证已经完毕了,但是在过程当中还有两个有趣的发现,也可以顺便说一下,眼尖的小伙伴可能已经发现了。
第一个就是存在着“五穷六绝七翻身”的指数,它就是上证指数,它五六七月份的胜率分别是%、%和.%,涨跌幅均值是-0.%、-1.和1.%,这样一看,是不是完美契合这句谚语了。
其实吧,只要你把各种市场指数、行业指数、风格指数、概念指数和板块指数统统都统计一遍,肯定能找出不少符合这种规律的指数,只不过占比不高,并不是主流,只要林子足够大,什么鸟儿都会有。
第二个发现其实我已经在上面的表格当中标注出来了,那就是在所有月份当中,二月份的胜率和涨跌幅均值出奇的高,如果还没有感觉的话,我们把它转化为柱状图展示就直观了。
特别是看二月份的涨跌幅均值,简直就是谷子地里窜高粱——硬生生高出一大截来,并且没有一个指数的二月份涨跌幅均值出现负数,二月份的胜率均值接近%,也是没有一个指数的二月份胜率是低于%的。
如果拿枪指着我的脑袋,让我硬是选一个月份翻身,我会毫不犹豫选择二月份,谁会跟概率过不去嘛。
其实上面的这些统计研究,在量化交易或金融工程里面有一个确切的术语,叫做“日历效应”,也就是研究那些与日期存在关联的非正常收益和非正常波动的数据特征现象。
如果大家对我国股市的日历效应感兴趣,特别是想了解清楚本次统计中二月份的胜率和收益为什么这么高,背后的金融逻辑是什么,推荐大家去看国海金工今年新出的深度金工研报《日历效应背后的择时策略探究》,在里面作者列举和解释了A股中各种各样与日期节假日相关的Alpha场景,并利用其中的原理构建指数择时和行业轮动策略。
这次就先聊到这儿,噢~对了,差点忘记说,找研报不方便的小伙伴,可在公众号“量化君也”后台回复暗号“日历效应”,就可以直接保存和下载上面那篇研报,如果对你有帮助的话,可以点个充满鼓励的“赞”告诉我,让我动力满满继续肝~
我是 @quantkoala,一枚大写的量化/程序化策略源码捕手,喜欢全方位收集分享市面上主流的策略源码(股票+期货+外汇),在“量化藏经阁”和“量化藏经阁Max”社群(入口)中,持续分享量化策略源码和量化知识等干货(目前已分享+套精品策略),欢迎关注点赞&联系沟通,探讨共赢&成果共享,相互交流&共同进步!!!常在线,多交流,多沟通!!!更多相关资料请见下方文章卡片,另外还有一个持续更新的公众号“量化君也”,专注于量化策略分享/交流/社群,欢迎来玩~
jieba源码解析(一)——中文分词
全模式解析:
全模式下的中文分词通过构建字典树和DAG实现。首先加载字典,字典树中记录词频,例如词"不拘一格"在字典树中表示为{ "不" : 0, "不拘" : 0, "不拘一" : 0, "不拘一格" : freq}。接着构造DAG,表示连续词段的起始位置。例如句子'我来到北京清华大学',分词过程如下:
1. '我':字典树中key=0,尝试'我来',不在字典,结束位置0寻找可能的分词,DAG为 { 0:[0]}。
2. '来':字典树中key=1,尝试'来到',在字典,继续尝试'来到北',不在字典,结束位置1寻找可能的分词,DAG为 { 0:[0], 1:[1]}。
3. '到':字典树中key=2,尝试'来到北',不在字典,结束位置2寻找可能的分词,DAG为 { 0:[0], 1:[1], 2:[2]}。
4. 以此类推,最终形成所有可能分词结果:我/ 来到/ 北京/ 清华/ 清华大学/ 华大/ 大学。
全模式的关键代码涉及字典树和DAG的构建与使用。
精确模式与HMM模式解析:
精确模式与HMM模式对句子'我来到北京清华大学'的分词结果分别为:
精确模式:'我'/'来到'/'北京'/'清华大学'
HMM模式:'我'/'来到'/'了'/'北京'/'清华大学'
HMM模式解决了发现新词的问题。解析过程分为三个步骤:
1. 生成所有可能的分词。
2. 生成每个key认为最好的分词。
3. 按照步骤2的方式对每个key的结果从前面向后组合,注意判断单字与下个单字是否可以组成新词。
最后,解析结果为:我/ 来到/ 北京/ 清华/ 清华大学
HMM模式中的Viterbi算法在jieba中用于发现新词。算法通过统计和概率计算,实现新词的发现与分词。
具体应用中,HMM模型包含五个元素:隐含状态、可观测状态、初始状态概率矩阵、隐含状态转移概率矩阵、观测状态转移概率矩阵。模型利用这些元素实现状态预测与概率计算,进而实现中文分词与新词发现。
在Viterbi算法中,重要的是理解隐含状态、可观测状态、转移概率矩阵之间的关系,以及如何利用这些信息进行状态预测和概率计算。具体实现细节在代码中体现,包括字典树构建、DAG构造、概率矩阵应用等。
使用 Elasticsearch 和 LlamaIndex 进行高级文本检索:句子窗口检索
在年,RAG技术及其应用如火如荼,特别是在构建Q/A聊天机器人和上下文驱动的代理方面,LlamaIndex和开源框架Langchain的兴起极大地推动了开发者构建复杂应用的能力。本文将深入探讨一种名为句子窗口检索(SWR)的高级RAG技术,它通过在定制知识库中选择性地提供上下文,提升了文本检索的质量和效率。
LlamaIndex作为一个强大的数据框架,专为LLM应用程序设计,支持私有或特定领域的数据处理。它开源且可广泛应用于各种场景,想要了解更多,可以访问GitHub项目。
句子窗口检索的核心是围绕查询选择性地获取上下文,然后在生成文本时整合更丰富的上下文。它通过限定在特定句子(“窗口上下文”)范围内,增强了信息提取的精确性和相关性。然而,选择合适的上下文窗口大小至关重要,以避免关键信息遗漏。
本文将指导如何利用Elasticsearch作为向量数据库,结合LlamaIndex设置SWR管道。首先,通过Docker启动单节点Elasticsearch实例。接下来,我们使用Jupyter Notebook设计应用,安装Python依赖,包括在pdf文件中使用LlamaIndex进行数据加载和处理。构建句子窗口索引和查询引擎是关键步骤,包括Node Parser、Service Context、Storage Context的创建,以及后处理器的定义,如SentenceTransformerRerank。
通过Kibana可视化结果,你可以尝试使用这个框架,甚至可以下载源代码进行自定义和比较性能。源码链接和更多相关信息可以在相关文档中找到。本文旨在提供详细的实践指导,欢迎探索并应用到你的项目中。