1、中文分词
中文分词,简单理解就是将一句话进行分割成几个词语。在把百度百科中的定义是将一个汉字序列切分成一个个单独的词。分词就是将连续的字序列按照一定的规范重新组合成词序列的过程。例如:
我是中国人,我爱中国。
经过分词之后,可能会变为:
我 是 中国人 我 爱 中国
上面是一个比较简单的例子。进行中文分词,是对中文非结构化文本进行处理的基础步骤。
英文的词与词之间具有天然的分隔符--空格。而中文并没有明显的分词边界,因此,中文分词在一定程度上是具有一定难度的。比如:
我与特朗普通电话。
这句话可以被分为:
我 与 特朗普 电话
也可以被分为:
我 与 特朗 普通 电话
因此,不同的分词方法出现的分词结果也不一样。
2、分词方法
中文分词属于自然语言处理(NLP)。中文分词的方法经过发展,经历了几个阶段。
- 基于规则的方法
- 基于统计分析的方法
- 基于神经网络的方法
目前,比较火热的方法是基于神经网络的方法。利用Bi-LSTM+CRF的组合模型能够达到较好的分词效果。
结巴分词是一个跨语言的开源中文分词器。结巴分词有Rust语言版本的分词器。结巴分词支持四种分词模式:
- 精确模式,试图将句子最精确地切开,适合文本分析;
- 全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义;
- 搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。
- paddle模式,利用PaddlePaddle深度学习框架,训练序列标注(双向GRU)网络模型实现分词。同时支持词性标注。
3、结巴分词安装
结巴分词的安装可以参考结巴分词Rust版本
在Cargo.toml
中添加如下代码:
[dependencies]
jieba-rs = "0.6"
这样就可以使用结巴分词了。
4、结巴分词使用示例
首先编写WebAssembly函数,将其定义为cut,然后new一个Jieba分词器,利用Jieba分词器中的cut方法来实现对中文分词。
use wasm_bindgen::prelude::*;
use jieba_rs::Jieba;
#[wasm_bindgen]
fn cut(sent: String) ->[String] {
let jieba = Jieba::new();
let words = jieba.cut("sent", false);
return words
}
接下来,利用ssvmup build
将 Rust 源代码编译为 WebAssembly 字节码,并为 Node.js 主机环境生成随附的 JavaScript 模块。
然后在app.js中导入cut函数。
const { cut } = require('../pkg/ssvm_nodejs_starter_lib.js');
const http = require('http');
const url = require('url');
const hostname = '127.0.0.1';
const port = 3000;
const server = http.createServer((req, res) => {
const queryObject = url.parse(req.url,true).query;
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end(cut(queryObject['sen']));
});
server.listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}/`);
});
接下来利用node node/app.js
启动nodejs服务器。
在浏览器中访问127.0.0.1:3000?sent=我是中国人
可以得到如下的返回结果:
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。