Android 分词功能,Android版中文分词:原理、接入和启动优化

fda5cf1d3e6a

中文分词

中文分词功能是一项常用的基础功能,有很多开源的工程实现,目前能应用于Android手机端的中文分词器没有很完善的版本。经过调研,我选择了结巴分词,该开源工程思路简单,易于理解,分词效果也还不错,目前有众多语言版本,PYTHON、C++、JAVA、IOS等,暂时还没有Android版本,所以我在Java版本的基础上进行了移植,开发了适用于Android手机的结巴分词Android版(Github)。

fda5cf1d3e6a

效果展示1

fda5cf1d3e6a

效果展示2

相比于Java版本的实现,Android版将字典文件存放在Asset目录下进行读取,同时对字典加载速度进行了大幅优化。原始的Java版本加载完整的字典文件在测试手机上需要28秒,时间太长,经过优化,成功将加载时间降到1.5秒,分词速度1秒以内,满足了Android手机的启动速度要求。

本文将结合代码通过以下三个方面展开介绍:结巴分词的基本原理,Android版的接入方式,以及启动速度优化的实现。

结巴分词的原理

结巴分词采用两种方式进行分词,基于字典的分词和基于HMM(隐马尔科夫模型)的分词。模型会首先加载词典文件生成一个字典树,并利用该字典树进行一段中文的分词,比如“我要去五道口吃肯德基”被分词成“我/要/去/五道口/吃/肯德基”,其中被分成单蹦个的连续中文字符,如“我/要/去”会继续经过HMM模型进行二次分词,看能不能合并成完整的单词,这种设计是为了对不在字典中的字符提供一种兜底的分词方案,可以尽可能的避免单蹦个的分词结果,优化分词的效果。

下面是进行分词的主函数:

private List sentenceProcess(String sentence) {

List tokens = new ArrayList();

int N = sentence.length();

long start = System.currentTimeMillis();

// 将一段文字转换成有向无环图,该有向无环图包含了跟字典文件得出的所有可能的单词切分

Map> dag = createDAG(sentence);

Map> route = calc(sentence, dag);

int x = 0;

int y = 0;

String buf;

StringBuilder sb = new StringBuilder();

while (x < N) { // 遍历一遍贪心算法生成的最小路径分词结果,对单蹦个的字符看看能不能粘合成一个词汇

y = route.get(x).key + 1;

String lWord = sentence.substring(x, y);

if (y - x == 1)

sb.append(lWord);

else {

if (sb.length() > 0) {

buf = sb.toString();

sb = new StringBuilder();

if (buf.length() == 1) { // 如果两个单词之间只有一个单蹦个的字符,添加

tokens.add(buf);

} else {

if (wordDict.containsWord(buf)) { // 如果连续单蹦个的字符粘合成的一个单词在字典树里,作为一个单词添加

tokens.add(buf);

} else {

finalSeg.cut(buf, tokens); // 如果连续单蹦个的字符粘合成的一个单词不在字典树里,使用维特比算法计算每个字符BMES如何选择使得概率最大

}

}

}

tokens.add(lWord);

}

x = y;

}

buf = sb.toString();

if (buf.length() > 0) { // 处理余下的部分

if (buf.length() == 1) {

tokens.add(buf);

} else {

if (wordDict.containsWord(buf)) {

tokens.add(buf);

} else {

finalSeg.cut(buf, tokens);

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
为了优化代码并添加中文分词与评价指标功能,我们可以使用以下步骤: 1. 导入必要的库和语料库,比如jieba分词库和sklearn评价指标库。 2. 定义一个函数,用于对输入的中文文本进行分词,并返回分词结果。 3. 定义一个函数,用于对生成的回复进行评价,并返回评价指标。 4. 将以上两个函数整合到一个主函数中,用于与用户进行交互,并输出回复和评价指标。 下面是代码示例: ```python import jieba from sklearn.metrics.pairwise import cosine_similarity # 导入语料库 corpus = ['你好', '很高兴见到你', '我喜欢你', '你是谁', '你从哪里来', '你要去哪里', '再见'] # 定义分词函数 def tokenize(text): return list(jieba.cut(text)) # 定义评价函数 def evaluate(reply): # 将生成的回复分词 reply_tokens = tokenize(reply) # 计算生成的回复与语料库中每个句子的相似度 similarity_scores = [cosine_similarity([reply_tokens], [tokenize(sentence)])[0][0] for sentence in corpus] # 取最大相似度作为评价指标 return max(similarity_scores) # 定义主函数 def chat(): print('你好,我是ChitGPT。') while True: # 获取用户输入 user_input = input('用户:') # 将用户输入分词 user_tokens = tokenize(user_input) # 计算用户输入与语料库中每个句子的相似度 similarity_scores = [cosine_similarity([user_tokens], [tokenize(sentence)])[0][0] for sentence in corpus] # 取最大相似度的句子作为回复 reply = corpus[similarity_scores.index(max(similarity_scores))] # 输出回复 print('ChitGPT:', reply) # 计算回复的评价指标 evaluation = evaluate(reply) # 输出评价指标 print('评价指标:', evaluation) ``` 在以上代码中,我们使用了jieba分词库对中文文本进行分词,并使用sklearn评价指标库计算相似度和评价指标。在主函数中,我们首先获取用户输入并将其分词,然后计算用户输入与语料库中每个句子的相似度,选择最大相似度的句子作为回复,并输出回复和评价指标。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值