利用Rust的中文分词服务

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=我是中国人
可以得到如下的返回结果:

image.png

你可能感兴趣的:(中文分词,rust,node.js)