一个朴素的搜索引擎实现

朴素贝叶斯分类器原理介绍及python代码实现 频率学派和贝叶斯学派 说起概率统计,不得不提到频率学派和贝叶斯学派,通过对概率的不同理解而演变的两个不同的概率学派。 频率学派 核心思想:需要得到的参数​是一个确定的值,虽然未知,但是不会因为样本的变化而变化,样本​数据随机产生的,因此在数据样本无限大时,其计算出来的频率即为概率。其重点主要在于研究样本空间,分析样本​的分布 延展应用:最大似然估计(MLE) 贝叶斯学派 核心思想:需要得到的参数​是随机变量,而样本​则是固定的,其重点主要在于研究参数​的分布。 由于在贝叶斯 阅读详情

今天我们要使用 Lucene 来实现一个简单的搜索引擎,我们要使用上一节爬取的果壳网语料库来构建索引,然后在索引的基础上进行关键词查询。

上一节果壳网的语料库放在了 Redis 中如下,有一个有效的文章 ID 集合,对于每一篇文章都会有一个 hash 结构存储了它的标题和 HTML 内容。

valid_article_ids => set(article_id)

article_${id} => hash(title=>${title}, html=>${html})

种不同功用的文件。构建索引的目标就是生成倒排索引,在本例中,会建立一个 title 标题的倒排索引和一个 html 内容的倒排索引,这是两个不同的倒排索引。

倒排索引就是分词词汇和文档 ID 列表的映射。如果是英文,那么就是一个个的英文单词,如果是中文,就需要中文分词词库来切分标题和内容来得到一个个的中文词语。这里的「文档 ID」 不是指文章 ID,而是 Lucene 内部的 Document 对象的唯一 ID。我们通过调用 Lucene 的 addDocument 方法添加进去的每一篇文章在 Lucene 内部都会有一个 Document 对象。

class InvertedIndex {
  Map<String, int[]> mappings; //  word => docIds
}

class Documents {
  Map<int, Document> docs;  // docId => document
}

在 Lucene 中,文档 ID 是一个 32bit 的「有符号整数」,按顺序添加进来的文档其 ID 也是连续递增的。因为它是 32bit,这也意味着 Lucene 的单个索引最多能存储 1<<31 -1 篇文档。文档 ID 之间可能会有空隙,因为 Lucene 的文档是支持删除操作的。

Elasticsearch 为了支持海量的文档存储,它内部对索引进行了分片存储(Sharding)。在内部实现中,它会使用到多个 Lucene 的索引来聚合处理。

好,下面我们来看看文档索引的构建是如何使用代码来完成的。首先导入 Lucene 依赖库

<dependency>
    <groupId>org.apache.lucene</groupId>
    <artifactId>lucene-core</artifactId>
    <version>8.2.0</version>
</dependency>

<dependency>
    <groupId>com.hankcs.nlp</groupId>
    <artifactId>hanlp-lucene-plugin</artifactId>
    <version>1.1.6</version>
</dependency>

// 中文分词分析器
var analyser = new HanLPAnalyzer();
// 指定索引的存储目录
var directory = FSDirectory.open(Path.of("./guokr"));
// 构造配置对象
var config = new IndexWriterConfig(analyser);
// 构造 IndexWriter 对象
var indexWriter = new IndexWriter(directory, config);

var redis = new JedisPool();
// 首先拿到所有的文章ID
var db = redis.getResource();
var articleIds = db.smembers("valid_article_ids");
db.close();
// 挨个添加
for(var id : articleIds) {
    // 取文章的标题和内容
    db = redis.getResource();
    var key = String.format("article_%s", id);
    var title = db.hget(key, "title");
    var html = db.hget(key, "html");
    var url = String.format("https://www.guokr.com/article/%s/", id);
    db.close();
    if(title != null && html != null) {
        // 干掉内容中所有的 HTML 标签只剩下纯文本
        var content = Jsoup.parse(html).text();
        // 构造文档
        var doc = new Document();
        doc.add(new TextField("title", title, Field.Store.YES));
        doc.add(new TextField("content", content, Field.Store.YES));
        doc.add(new StoredField("url", url));
        // 这里添加文档
        indexWriter.addDocument(doc);
    }
}

indexWriter.close();
directory.close();

上面的代码最关键的地方在于 Document 对象的构造

var doc = new Document();
doc.add(new TextField("title", title, Field.Store.YES));
doc.add(new TextField("content", content, Field.Store.YES));
doc.add(new StoredField("url", url));

注意到 TextField 对象的最后一个参数指明是否存储字段的内容,如果这个字段设置为 Field.Store.NO,那么 Lucene 就不存储这个字段的值,但是还是会将这个值的文本进行切词后放入倒排索引中。在关键词查询阶段,我们可以根据关键词搜索到文档 ID,进一步得到这个文档的具体内容,但是文档的内容会缺失这个字段,因为 Lucene 没有存它。简单的说这个字段是隐身的,它在搜索时会起到作用,但是最终的搜索结果里却看不见它。之所以提供这个选项,很明显这是为了可以节约存储空间。

同时我们还注意到 url 字段使用了 StoreField,这是啥意思?它的意思和 Field.Store.NO 正好相反。它只存储字段的值,不参与检索,相当于文档的附加字段。通俗点讲它就是个「搭便车」字段 —— 老司机带带我。

现在让我们跑一跑这个程序,跑完之后打开 ./guokr 目录,看看里面都有些啥。

bash> ls -l

total 13824
-rw-r--r--  1 qianwenpin  staff   299B  9  4 14:22 _0.cfe
-rw-r--r--  1 qianwenpin  staff   6.7M  9  4 14:22 _0.cfs
-rw-r--r--  1 qianwenpin  staff   383B  9  4 14:22 _0.si
-rw-r--r--  1 qianwenpin  staff   137B  9  4 14:22 segments_1
-rw-r--r--  1 qianwenpin  staff     0B  9  4 14:22 write.lock

640?wx_fmt=png
图片

Lucene 虽然不允许多进程同时写,但是可以单进程写多进程读,也就是单写多读。好接下来我们开始尝试 Lucene 的读操作 —— 关键词查询。

查询操作需要构造一个关键对象 IndexSearcher,它的构造方式比 IndexWriter 简单很多。

var directory = FSDirectory.open(Path.of("./guokr"));
var reader = DirectoryReader.open(directory);
var searcher = new IndexSearcher(reader);

var query = new TermQuery(new Term("title", "动物"));

var hits = searcher.search(query, 10).scoreDocs;
for(var hit : hits) {
    var doc = searcher.doc(hit.doc);
    System.out.printf("%s=>%s\n", doc.get("url"), doc.get("title"));
}

reader.close();
directory.close();

640?wx_fmt=png
图片

所有的文章标题里确实都有「动物」这个词。下面我们改变一下查询的输入,改为从内容查询,并且必须同时包含「动物」和 「世界」两个词汇。这是一个复合查询,复合查询需要使用到一个关键的类 BooleanQuery,它可以对多个子 Query 进行逻辑组合来融合查询结果。

var query1 = new TermQuery(new Term("content", "动物"));
var query2 = new TermQuery(new Term("content", "世界"));
var query = new BooleanQuery.Builder()
        .add(query1, BooleanClause.Occur.MUST)
        .add(query2, BooleanClause.Occur.MUST)
        .build();

640?wx_fmt=png
图片

我们可以点开链接看看文章的内容进行验证一下。

640?wx_fmt=png
图片

下面我们继续改变查询条件,还是从内容查询,但是条件变为包含「动物」但是不得有「世界」这个词汇,估计满足这样条件的文章会非常多。

var query1 = new TermQuery(new Term("content", "动物"));
var query2 = new TermQuery(new Term("content", "世界"));
var query = new BooleanQuery.Builder()
        .add(query1, BooleanClause.Occur.MUST)
        .add(query2, BooleanClause.Occur.MUST_NOT)
        .build();

var query1 = new TermQuery(new Term("content", "动物"));
var query2 = new TermQuery(new Term("content", "经济"));
var query = new BooleanQuery.Builder()
        .add(query1, BooleanClause.Occur.SHOULD)
        .add(query2, BooleanClause.Occur.SHOULD)
        .build();

var query1 = new TermQuery(new Term("content", "动物"));
var query2 = new TermQuery(new Term("content", "经济"));
var query = new BooleanQuery.Builder()
        .add(query1, BooleanClause.Occur.MUST)
        .add(query2, BooleanClause.Occur.SHOULD)
        .build();

前面提到 MUST 表示必须包含,MUST_NOT 表示必须不包含。但是如果将两个 MUST_NOT 组合你得到的将会是空查询。为什么会这样呢?

var query1 = new TermQuery(new Term("content", "动物"));
var query2 = new TermQuery(new Term("content", "经济"));
var query = new BooleanQuery.Builder()
        .add(query1, BooleanClause.Occur.MUST_NOT)
        .add(query2, BooleanClause.Occur.MUST_NOT)
        .build();

var query1 = new TermQuery(new Term("content", "动物"));
var query = new BooleanQuery.Builder()
        .add(query1, BooleanClause.Occur.MUST_NOT)
        .build();

最后我们再看一下 FILTER 选项的作用,它和 SHOULD 正好相反。SHOULD 不影响查询结果,但是会影响排序,而 FILTER 会影响查询结果但是不影响排序,它只起到过滤的作用,就好比数据库查询里的 Where 条件。

var query1 = new TermQuery(new Term("content", "动物"));
var query2 = new TermQuery(new Term("content", "经济"));
var query = new BooleanQuery.Builder()
        .add(query1, BooleanClause.Occur.FILTER)
        .add(query2, BooleanClause.Occur.FILTER)
        .build();

关于 Lucene 查询语句的更多奥秘,在后面的文章中我们会继续深入探讨。

下面是有钱(有老钱)的字节跳动内推入口,找出自己心意的职位后,请勇于投递你的个人简历,内部系统的数据安全性做得非常到位,我是看不到你们的简历内容的,所以不必太担心个人隐私问题。北京、上海、深圳、杭州、成都、广州等城市的职位都有,Python、Java、Golang、算法、数据、分布式计算和存储的岗位也都有,各人发挥自己的搜商自行搜寻。请认真投递自己的简历,否则可能连面试的机会都没有。

640?wx_fmt=png

使用Sklearn学习朴素贝叶斯算法 上一篇文章我向大家介绍了朴素贝叶斯工作的理论部分,需要看的小伙伴请移步:贝叶斯分类器,接下来,我们基于Sklearn机器学习库来使用以下具体的贝叶斯分类器算法。 1,sklearn中的贝叶斯分类器 Sklearn基于数据分布以及这些分布上的概率估计的改进,为我们提供了四个朴素贝叶斯的分类器。 类 含义 naive_bayes.BernoulliNB 伯努利分布下的朴素贝叶斯 naive_bayes.GaussianNB 高斯分布下的朴素贝叶斯 naive_bayes.Mu 阅读详情

相关推荐

朴素贝叶斯算法Java 实现

对于朴素贝叶斯算法相信做数据挖掘和推荐系统的小伙们都耳熟能详了,算法原理我就不啰嗦了。我主要想通过java代码实现朴素贝叶斯算法,思想: 1. 用javabean +Arraylist 对于训练数据存储 2. 对于样本数据训练 具体的代码如下:package NB; /** * 训练样本的属性 javaBean * */ public class JavaBean { int ag

追梦恋影的博客 1万+

要飞起来了,Lucene 高阶查询技巧

在前面的章节中我们使用了最基础的关键词查询 TermQuery 和 复合查询 BooleanQuery,本节我们来尝试 Lucene 内置的其它高级查询功能。字符串前缀查...

codehole_的博客 472

使用python实现朴素贝叶斯

使用python实现朴素贝叶斯算法回顾计算先验概率和条件概率计算条件独立的联合概率输出联合概率最大的类别代码分析算法的实现算法的使用算法的对比全部代码 这节课我们将使用 python 的一些基本代码来实现朴素贝叶斯分类算法,然后利用我们自己写的算法在鸢尾花(iris)数据集上完成分类任务!有了上一节课的理论分析基础,这一节课的算法实现也就很简单了,下面我们先来梳理和回顾一下上节课所学的算法原理。 算法回顾 计算先验概率和条件概率 lambda=0时为极大似然估计,lambda>0时为贝叶斯估计;这里

一名新生程序员的日常 4586

lucene-对搜索结果进行排序

1、   在IndexSearcher类中包含了几个可重载的search方法,有一个对结果进行排序的search方法声明为search(Query,Sort)   public classSortingExample{     private Directory directory;          public SortingExample(Directory direco

深未来技术 626

相控阵雷达仿真入门:TWS与TAS模式实战解析(附代码示例)

本文深入解析相控阵雷达仿真中的TWS(边搜索边跟踪)与TAS(搜索加跟踪)模式,提供实战代码示例和优化策略。通过简化模型设计和对象化建模,帮助开发者快速构建高效仿真系统,适用于军事推演和装备评估。文章涵盖核心逻辑、数据结构设计及性能优化技巧,提升仿真效率与准确性。

weixin_30687051的博客 455

Qt QChart实战:从零打造一个实时温度监控仪表盘(附完整源码)

本文详细介绍了如何使用Qt QChart模块从零构建一个工业级实时温度监控仪表盘。通过实战案例,展示了波形图的绘制、坐标轴配置、数据流模拟等关键技术,并提供了完整的源码实现,帮助开发者快速掌握Qt在数据可视化领域的应用。

weixin_42537919的博客 246

ElasticSearch学习笔记一初识 Lucene

初识 Lucene什么是全文检索?非结构化数据搜索方法Lucene 简介索引和搜索新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图...

灵动的艺术的博客 1802

海外最新AI营销AI销售书籍推荐AI营销培训讲师AI销售培训讲师人工智能营销培训师人工智能销售培训师AI赋能营销培训AI赋能销售培训企业AI营销内训企业AI销售内训AI营销课程讲师AI销售课程讲师

专栏|AI营销与AI销售实战 · 第46期在这个人类与算法共舞的时代,销售,已经不是你我熟悉的那个“打电话、见客户、做PPT”的老行当了。你还以为销售是“打感情牌”?错了,情感要继续,但方式已经升级。你还以为AI只是“写写文案”?错了,文案只是皮毛,真正的杀器,是思维方式的重构,是认知地图的重绘。首先,我们需要明确一个事实:AI并不会消灭销售这个职业,但它必然会重新定义销售的本质。在销售领域,真正的制胜之道不是简单地采用AI工具,而是的能力。

Akibfrycc的博客 1102

lucene 按照匹配度排序_基于 Lucene 实现一个朴素的搜索引擎

今天我们要使用 Lucene 来实现一个简单的搜索引擎,我们要使用上一节爬取的果壳网语料库来构建索引,然后在索引的基础上进行关键词查询。上一节果壳网的语料库放在了 Redis 中如下,有一个有效的文章 ID 集合,对于每一篇文章都会有一个 hash 结构存储了它的标题和 HTML 内容。valid_article_ids Lucene 需要将构建的索引库放在一个指定的目录中,在这个目录里会存放很多...

weixin_39845347的博客 217

ArcGIS 10.4 Desktop安装步骤。

步骤 1 :安装 LicenseManager 有了安装包以后,我们进入安装包文件目录,如图所示,首先需要安装ArcGIS license manager,即点击打开图中红色框中exe文件。 PS:安装 LicenseManager,关于 License 的安装路径一般默认即可,因为很小的,装C 盘也无所谓了,当然了自己改了也可以的,但是不建议! 即便修改路径,建议只改盘符,不修改相对路径方式! 如:C:\Program Files (x86)\ArcGIS\License10.6 修改为 D:\.

IT爱好者 2万+

(UE5 5.2)HISM Mobile DrawInstance在渲染层的实现浅分析

在 (UE4 4.27) UHierarchicalInstancedStaticMesh(HISM)原理分析 这篇博客大致介绍HISM组件从游戏线程到渲染线程的重建KD-Tree和剔除并提交DrawCall逻辑,但是没有分析渲染层的大致数据结构和实现. 可以看出FHierarchicalStaticMeshSceneProxy 实际存储Instance数组数据来自于FInstancedStaticMeshSceneProxy FHierarchicalStaticMeshSceneProxy只是以FClu

qq_29523119的博客 2726

机器学习方法总结(七):朴素贝叶斯

朴素贝叶斯 1.简介     朴素贝叶斯法是典型的生成学习方法,生成方法由训练数据得到联合概率分布P(X,Y)和先验概率P(X),在训练的过程中求得后验概率P(Y|X),即:P(X,Y)=P(Y|X)P(Y),在测试时去求P(X|Y),而前几篇文章介绍的算法都是基于判别的模型,直接去拟合后验概率,注意这里为什么要叫朴素贝叶斯,朴素的原因就是因为它的特征都是独立不会互相影响的。 2.流程  ...

qq_38593211的博客 363

nupkg 本地安装_使用Nuget安装离线包nupkg

一:Nuget简介:NuGet 是免费、开源的包管理开发工具,专注于在 .NET 应用开发过程中,简单地合并第三方的组件库。当需要分享开发的工具或是库,需要建立一个Nuget package,然后把这个package放到Nuget的站点。如果想要使用别人已经开发好的工具或是库,只需要从站点获得这个package,并且安装到自己的Visual Studio项目或是解决方案里。NuGet能更方便地把一...

weixin_34460380的博客 1万+

三种常用的朴素贝叶斯实现算法——高斯朴素贝叶斯、伯努利朴素贝叶斯、多项式朴素贝叶斯

在sklearn中,提供了若干种朴素贝叶斯的实现算法,不同的朴素贝叶斯算法,主要是对P(xi|y)的分布假设不同,进而采用不同的参数估计方式。我们能够发现,朴素贝叶斯算法,主要就是计算P(xi|y),一旦P(xi|y)确定,最终属于每个类别的概率,自然也就迎刃而解了。 常用的三种朴素贝叶斯为: 高斯朴素贝叶斯 伯努利朴素贝叶斯 多项式朴素贝叶斯 高斯朴素贝叶斯 适用于连续变量,其假定各个特征x...

ws19920726的博客 1万+

AI时代的软件质量保证新方法论

3.2.1 质量保证的方法论 质量保证(Quality Assurance, QA)是一种系统化的方法,用于确保产品或服务符合预定的质量标准。在AI时代,软件质量保证的方法论需要适应不断变化的AI技术和应用场景。 3.2.1.1 质量管理体系的构建 首先,构建一个完善

AI天才研究院 1357

微信小程序云开发 - 实现商家转账到零钱(微信企业付款到零钱) V3功能流程及完整实例代码,过微信云开发的云函数实现企业付款到零钱(提供详细示例源码纯云函数实现,证书、密钥、签名等各种常见问题解决方案

企业付款到零钱(微信小程序提现功能,提现到零钱)微信小程序-云函数实现微信企业付款到零钱功能,实现微信商户号中的企业付款到零钱的功能,微信小程序+云开发+商家转账至零钱+微信小程序用户提现,使用云开发环境的云函数实现微信小程序的支付功能,微信小程序实现微信企业付款到零钱功能的流程,V3 V2基于微信云开发的商家转账至零钱,小程序云函数企业付款到零钱功能实现,云开发实现微信商户支付企业付款到零钱功能,不用服务器纯云函数实现,详细示例代码demo教程,API证书错误,转账不到账怎么办,密钥生成有误,转账失败,有

🏆 前端领域优质创作者 1万+

机器学习之朴素贝叶斯算法的详解(包含高斯朴素贝特斯、多项式朴素贝叶斯、伯努利朴素贝叶斯,以及相应算法的简单实现)

机器学习18_贝叶斯算法详解(2021.06.02) 一. 朴素贝叶斯算法 为什么需要朴素贝叶斯算法? 比如说,我们想预测一个人究竟是否能够侥幸在空难中生还,那么我们就需要建立一个分类模型来学习我们的训练集。在训练集中,其中一个人的特征是30岁,男,普通舱,他最终在空难中去世了。训练完成后,当我们使用训练好的模型进行测试的时候,测试的目标的特征也是30岁,男,普通舱,那么我们的模型必然会给这个人打上去世的标签。然而事实却不一定为此,也许这个人正好坐在了离逃生口最近的位置,他得到了第一时间的救治而生存下来了

weixin_40247876的博客 7654

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

朴素贝叶斯在搜索引擎优化中的应用

1.背景介绍 搜索引擎优化(SEO,Search Engine Optimization)是一种优化网站结构、内容和代码的方法,以提高网站在搜索引擎中的排名。这有助于提高网站的可见性,从而吸引更多的用户访问。搜索引擎优化的主要目标是提高网站的排名,以便在搜索结果中排名更高,从而吸引更多的用户访问。 朴素贝叶斯(Naive Bayes)是一种概率模型,它被广泛应用于文本分类、垃圾邮件过滤、情感分...

AI天才研究院 690

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Python 实现朴素贝叶斯代码演示

朴素贝叶斯可以细分为三种方法:分别是伯努利朴素贝叶斯、高斯朴素贝叶斯和多项式朴素贝叶斯。下文就这三种方法进行详细讲解和演示。 目录 一、伯努利朴素贝叶斯方法 1.1 例子解答 1.1.1 代码: 1.1.2 结果: 二、高斯朴素贝叶斯方法 2.1 解题 2.1.1 代码: 2.1.2 结果: 2.2 检查高斯朴素贝叶斯的正确率 2.2.1 代码: 2.2.2 结果: 三、多项式朴素贝叶斯方法 3.1 多项式朴素贝叶斯实现新闻文本分类 3.1.1 代码 3.1.2 结果...

maggieyiyi的博客 1万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

高斯朴素贝叶斯,多项朴素贝叶斯,伯努利朴素贝叶斯

高斯朴素贝叶斯 GaussianNB 实现了运用于分类的高斯朴素贝叶斯算法。特征的可能性(即概率)假设为高斯分布: 参数使用最大似然法估计。 高斯朴素贝叶斯实现方法代码: '''高斯朴素贝叶斯''' def MyGaussianNB(trainMat='',Classlabels='',testDoc=''): # -----sklearn GaussianNB------- # 训练数据 X = np.array(trainMat) Y = np.arr.

viviliving的专栏 2591

什么是朴素贝叶斯

人工智能

善良的小乔的博客 2643

朴素贝叶斯算法(python 实现)

利用贝叶斯算法实现分类 import pandas as pd from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from collections import Counter import time class Beyes(object): def _...

pandas学习笔记 8251

朴素贝叶斯分类的python的实现

sklearn 是 scikit–learn 的简称,是一个基于 Python 的第三方模块。sklearn 库集成了一些常用的机器学习方法,在进行机器学习任务时,并不需要实现算法,只需要简单的调用 sklearn 库中提供的模块就能完成大多数的机器学习任务。在sklearn中,一共有3个朴素贝叶斯的分类算法类:GaussianNB(先验是高斯分布的朴素贝叶斯);BernoulliNB(先验为伯努利分布的朴素贝叶斯);MultinomialNB(先验是多项式分布的朴素贝叶斯)。

辉的博客 6688

朴素贝叶斯算法实现新闻分类(Sklearn实现)

目录 1、朴素贝叶斯实现新闻分类的步骤 2、代码实现 1、朴素贝叶斯实现新闻分类的步骤 (1)提供文本文件,即数据集下载 (2)准备数据 将数据集划分为训练集和测试集;使用jieba模块进行分词,词频统计,停用词过滤,文本特征提取,将文本数据向量化 停用词文本stopwords_cn.txt下载 jieba模块学习:https:...

分享实践与思考 1万+
上一篇: 5折抢购最后一天 | 戴尔顶级配置电脑,限时秒!
下一篇: 倒排索引的精致结构
码洞
博客等级 码龄10年 41粉丝 137原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值