首页
免费后端云服务
关于
推荐
免费图床源码
Search
1
小程序后端入门系列视频教程【一-微信开发工具介绍】
9,722 阅读
2
微信小程序三级联动之多列选择器
9,606 阅读
3
小程序开发免费后端之神秘利器分享
9,536 阅读
4
Golang-开发企业级资源权限管理【第一步表设计】-1
9,081 阅读
5
学会微信服务端开发第一步
8,979 阅读
日常记录
日常
随笔
Bmob后端云
从零开始学物联网
Serverless实战驾校小程序
心邮
Serverless
向量数据库
登录
Search
Magic
累计撰写
124
篇文章
累计收到
71
条评论
首页
栏目
日常记录
日常
随笔
Bmob后端云
从零开始学物联网
Serverless实战驾校小程序
心邮
Serverless
向量数据库
页面
免费后端云服务
关于
推荐
免费图床源码
搜索到
51
篇与
的结果
2014-06-30
解密搜索引擎技术之中文分词与实现
中文分词一直都是中文自然语言处理领域的基础研究,也是中文搜索引擎的核心模块之一。目前而言的分词系统绝大多数都是基于中文词典的匹配算法,其中,最为常见的是最大匹配算法(Maximum Matching,以下简称MM算法),而MM算法有三种:一种正向最大匹配、一种逆向最大匹配和双向匹配。本文以正向最大匹配算法为例介绍其基本思想和实现。 一、基本思想 (1)假设词典中最长的词语字数为w(一般设置为8个字符,即4个汉字)。 (2)判断带分词语句长度是否大于w个字,如果大于w则跳到(3),如果小于w则跳到(6)。 (3)取待分词语句的前w个字。 (4)在词典中查找w,如果存在,则从语句中去掉w,从语句中w后的词开始重复上面过程。 (5)如果不存在,就去掉这w个字的最后一个字。 (6)检查是否是单字或者空,如果是,则退出。 (7)如果不是,则继续判断词库中是否存在这个词,如此反复循环,直到输出一个词。 (8)继续取短语的前w个字反复循环,这样就可以将一个语句分成词语的组合了。 二、简单实现includeincludeincludeusing namespace std; set g_setWordDictionary; int construct() { g_setWordDictionary.insert("中国"); g_setWordDictionary.insert("中国人"); g_setWordDictionary.insert("纽约"); g_setWordDictionary.insert("北京"); } bool match(string &word) { set::iterator itor = g_setWordDictionary.find(word); if (itor == g_setWordDictionary.end()) { return false; } return true; } void forward_maximum_matching(string content, set &keywords) {define MAX_LEN 12 //词库中最长词语(utf-8一个汉字3个字节)define MIN_LEN 3 //单字(原理同上)int len = content.length(); int right_len = len; int start_pos = 0; bool ret = false; string kw_value = ""; int kw_len = 0; int kw_pos = 0; //单字或空串 while (right_len > MIN_LEN) { //语句大于词库中最长词语 if (right_len >= MAX_LEN) { kw_value = content.substr(start_pos, MAX_LEN); } //语句小于词库中最长词语 else { kw_value = content.substr(start_pos, right_len); } //词库匹配 ret = match(kw_value); kw_len = kw_value.length(); kw_pos = 0; while (!ret && kw_len > 2*MIN_LEN) { //去掉候选词右边一个汉字 kw_len -= MIN_LEN; kw_value = kw_value.substr(kw_pos, kw_len); //继续匹配 ret = match(kw_value); } //匹配到词 if (ret) { keywords.insert(kw_value); //从语句中去掉匹配到的词 start_pos += kw_len; right_len = len - start_pos; } //未匹配到词,下移一个字 else { start_pos += MIN_LEN; right_len = len - start_pos; } }//while (right_len > MIN_LEN) } int main() { //构造词库 construct(); //切分词库 string content = "我是中国人,我是来自中国北京的中国人,在纽约工作"; set keywords; forward_maximum_matching(content, keywords); set::iterator itor; //输出分词 for (itor=keywords.begin(); itor!=keywords.end(); ++itor) { printf("result: %s\n", (*itor).c_str()); } return 0; }
2014年06月30日
4 阅读
0 评论
0 点赞
2014-06-14
精选37条强大的常用linux shell命令组合
原文已删除
2014年06月14日
4 阅读
0 评论
0 点赞
2014-04-03
amd规范、cmd规范异同
相同之处RequireJS 和 Sea.js 都是模块加载器,倡导模块化开发理念,核心价值是让 JavaScript 的模块化开发变得简单自然。不同之处两者的主要区别如下:定位有差异 。RequireJS 想成为浏览器端的模块加载器,同时也想成为 Rhino / Node 等环境的模块加载器。Sea.js 则专注于 Web 浏览器端,同时通过 Node 扩展的方式可以很方便跑在 Node 环境中。遵循的规范不同 。RequireJS 遵循 AMD(异步模块定义)规范,Sea.js 遵循 CMD (通用模块定义)规范。规范的不同,导致了两者 API 不同。Sea.js 更贴近 CommonJS Modules/1.1 和 Node Modules 规范。推广理念有差异 。RequireJS 在尝试让第三方类库修改自身来支持 RequireJS,目前只有少数社区采纳。Sea.js 不强推,采用自主封装的方式来“海纳百川”,目前已有较成熟的封装策略。对开发调试的支持有差异 。Sea.js 非常关注代码的开发调试,有 nocache、debug 等用于调试的插件。RequireJS 无这方面的明显支持。插件机制不同 。RequireJS 采取的是在源码中预留接口的形式,插件类型比较单一。Sea.js 采取的是通用事件机制,插件类型更丰富。还有不少差异,涉及具体使用方式和源码实现,欢迎有兴趣者研究并发表看法。总之,如果说 RequireJS 是 Prototype 类库的话,则 Sea.js 致力于成为 jQuery 类库。最重要的最后,向 RequireJS 致敬!RequireJS 和 Sea.js 是好兄弟,一起努力推广模块化开发思想,这才是最重要的。更新2013.06.30 推荐一篇图片并茂的文章:参考从 RequireJS 到 Sea.js 系列: (要翻墙)(要翻墙)CMD 规范在这里: AMD 是 RequireJS 在推广过程中对模块定义的规范化产出。 CMD 是 SeaJS 在推广过程中对模块定义的规范化产出。 类似的还有 CommonJS Modules/2.0 规范,是 BravoJS 在推广过程中对模块定义的规范化产出。 还有不少?? 这些规范的目的都是为了 JavaScript 的模块化开发,特别是在浏览器端的。 目前这些规范的实现都能达成浏览器端模块化开发的目的 。区别: 1. 对于依赖的模块,AMD 是提前执行 ,CMD 是延迟执行 。不过 RequireJS 从 2.0 开始,也改成可以延迟执行(根据写法不同,处理方式不同)。CMD 推崇 as lazy as possible. 2. CMD 推崇依赖就近 ,AMD 推崇依赖前置 。看代码: // CMD define(function(require, exports, module) { var a = require('./a') a.doSomething() // 此处略去 100 行 var b = require('./b') // 依赖可以就近书写 b.doSomething() // ... }) // AMD 默认推荐的是 define(['./a', './b'], function(a, b) { // 依赖必须一开始就写好 a.doSomething() // 此处略去 100 行 b.doSomething() ... }) 虽然 AMD 也支持 CMD 的写法,同时还支持将 require 作为依赖项传递,但 RequireJS的作者默认是最喜欢上面的写法,也是官方文档里默认的模块定义写法。 3. AMD 的 API 默认是一个当多个用 ,CMD 的 API 严格区分,推崇职责单一 。比如 AMD 里,require 分全局require 和局部 require,都叫 require。CMD 里,没有全局 require,而是根据模块系统的完备性,提供 seajs.use来实现模块系统的加载启动。CMD 里,每个 API 都简单纯粹 。 4. 还有一些细节差异,具体看这个规范的定义就好,就不多说了。
2014年04月03日
3 阅读
0 评论
0 点赞
2014-01-24
windows svn自动更新
实现原理是,利用svn版本库,hooks目录的bat钩子开展工作。 共在hooks目录下建立3个文件如下: post-commit.bat 作用是:钩子入口! postcommit.log 作用是:记录最后一次执行的结果(可以记录最后一次报错)建立一个空文件就好! post-commit-run.bat 作用是:自动更新的核心部分! post-commit.bat的代码是: call %~dp0post-commit-run.bat %* > %~dp0postcommit.log 2>&1 post-commit-run.bat的代码是: @echo off SET REPOS=%1 SET REV=%2 SET DIR=%REPOS%/hooks SET PATH=%PATH%; svnupdate D:\Web\ditan520 --username admin --password 123456 注意填写用户名和密码,这里的是:admin和123456.
2014年01月24日
4 阅读
0 评论
0 点赞
2013-11-16
知识源于分享,如何写出一本书
经历了6年,想了很久,一直想自己写本书。这些年虽然写过许多份博客(后来关闭了)系统说明书,以及一些需求文档等,但从没真正意义上系统的写本书。经过几天,书名已经想好《走向产品经理 》。 写书大概分为以下3阶段。第一阶段:选题阶段 第二阶段:编写阶段 第三阶段:出版阶段第一阶段:选题阶段严格来讲,选题评估和论证阶段,任何一个选题,我们都需要作者提供一些基本信息,比如固定格式的选题表、写作的大纲、样章等。通过这些信息,编辑可以很好地了解选题的读者定位、写作思路、特色、作者背景、篇幅及交稿时间等。 作者提供这些信息时有一些简单的要求和提示:1.图书选题申报表(见本文右侧的本文附件)中要重视图书的篇幅和交稿时间,写作思路,技术背景的简单介绍,读者定位,内容简介,与同类图书的对比本书的特色和优势,作者背景(所有参与具体写作的作者都应介绍)。2.写作大纲,即图书目录,要具体到章、节,甚至小节。通过大纲,应能充分体现出书的写作思路,书的具体内容和写作方式,书的大致篇幅和结构,书的特色和优势。3.样章要能体现作者文笔、文风,写书能体现作者的逻辑表达能力和文字功底。若是多个作者合作,每个作者都要提供样章,而且写作风格要尽量统一。第二阶段:编写阶段编辑一般会要求作者在约定交稿时间的1/4、2/4、3/4时(具体会落实到X年X月X日)进行阶段回稿。阶段回稿的目的很明确,一是及时跟踪稿件的进度和质量,二是及时给作者修改和反馈意见。一般情况下收到阶段回稿的稿件后,编辑会在10个工作日内给出反馈意见。第三阶段:出版阶段花2万多元买个书号,再自费去印刷厂找设计找印刷,即可当然还有其他几种方式,但如果不是专业作家,写书只想系统的分享知识,不必出版即可。
2013年11月16日
1 阅读
4 评论
0 点赞
1
...
4
5
6
...
11