Unity Android 之 使用 HanLP 进行句子段落的分词处理(包括词的属性处理)的简单整理

Unity Android 之 使用 HanLP 进行句子段落的分词处理(包括词的属性处理)的简单整理

目录

Unity Android 之 使用 HanLP 进行句子段落的分词处理(包括词的属性处理)的简单整理

一、简单介绍

二、实现原理

三、注意事项

四、效果预览

五、实现步骤

六、关键代码

附录:在 HanLP 中,Term 对象的 nature 字段表示词性


一、简单介绍

Unity Android 开发上会用到的技术简单整理,方便自己日后查看,能帮助到大家就更好了。

本节介绍,Unity 开发中,把从 Android 封装HanLP 的分词功能,在 Unity 中进行调用的方法整理封装给Unity调用,方法不唯一,欢迎指正。

在 Android 平台上,除了 HanLP,还有其他一些可以用于中文分词处理的算法和工具。以下是一些常见的中文分词算法,以及 HanLP 在分词中的一些优势:

常见的中文分词算法和工具:

    ansj_seg: ansj_seg 是一个基于 CRF 和 HMM 模型的中文分词工具,适用于 Java 平台。它支持细粒度和粗粒度的分词,并具有一定的自定义词典和词性标注功能。

    jieba: jieba 是一个在 Python 中广泛使用的中文分词库,但也有其 Java 版本。它采用了基于前缀词典的分词方法,并在速度和效果方面表现出色。

    lucene-analyzers-smartcn: 这是 Apache Lucene 项目中的一个中文分词器,使用了基于规则的分词算法。它在 Lucene 搜索引擎中被广泛使用。

    ictclas4j: ictclas4j 是一个中科院计算所开发的中文分词工具,基于 HMM 模型。它支持自定义词典和词性标注。

HanLP 分词的优势:

    多领域适用性: HanLP 被设计为一个面向多领域的中文自然语言处理工具包,不仅包括分词,还支持词性标注、命名实体识别、依存句法分析等多种任务。

    性能和效果: HanLP 在多个标准数据集上进行了训练和优化,具有较好的分词效果和性能。

    灵活的词典支持: HanLP 支持自定义词典,你可以根据需要添加专业领域的词汇,以提升分词效果。

    开放源代码: HanLP 是开源的,你可以自由使用、修改和分发,有利于定制和集成到你的项目中。

    多语言支持: HanLP 不仅支持中文,还支持其他语言,如英文、日文等,为跨语言处理提供了便利。

    社区活跃: HanLP 拥有活跃的社区和维护团队,有助于解决问题和获取支持。

总之,HanLP 是一个功能丰富且性能优越的中文自然语言处理工具,适用于各种应用场景,特别是在多领域的文本处理任务中表现出色。然而,最终的选择取决于你的具体需求和项目背景。
 

HanLP 官网:HanLP | 在线演示

HanLP GitHub:GitHub - hankcs/HanLP: 中文分词 词性标注 命名实体识别 依存句法分析 成分句法分析 语义依存分析 语义角色标注 指代消解 风格转换 语义相似度 新词发现 关键词短语提取 自动摘要 文本分类聚类 拼音简繁转换 自然语言处理

二、实现原理

1、在 Android 端 使用 StandardTokenizer.segment(text) 传入文本 Text 内容进行分词,使用 Term.word; 获取分词内容,Term.nature.toString() 获取分词的属性

2、把安卓端封装的功能接口暴露给 Unity 调用

    /*** 开始分词* @param wordsContent* @return 返回分词结果,和此属性*/public String segmentWork(String wordsContent)

3、在 Unity 端获取 Android 端的对象接口,并简单处理信息,使之更适合在Unity端使用

MAndroidJavaObject.Call<string>("segmentWork", wordsContent)

三、注意事项

1、中文的词会有对应较为准确的此属性,英文可能没有

2、Android 与 Unity 交互一般只能传递基础数据类型,列表对象的高级对象可能传递不了,这里把列表对象数据组装成字符串进行传递给 Unity ,Unity 在根据 string 解析拆出对应信息

四、效果预览

(这里词性只做了简单的对应,需要更多对应可以参见附录词性信息)

 

五、实现步骤

HanLP 包(hanlp-portable-1.7.5.jar ) 获取可以在这里直接在 Android Studio 中下载

Android Studio 之 Android 中使用 HanLP 进行句子段落的分词处理(包括词的属性处理)的简单整理

1、打开 Android Studio ,创建一个模块工程,添加 hanlp-portable-1.7.5.jar 包

注意:记得添加为库

 2、创建脚本,添加分词功能

 3、创建一个 Unity 工程,把编译生成的 aar 给添加到 Unity 中

 

4、 在 Unity 中创建脚本,调用 Android 中封装的接口,并编写脚本测试功能

 5、把测试脚本添加到场景中

6、打包,安装到机子上运行,效果如上

 

六、关键代码

1、TestChineseSegmentationHanlpHelper.cs

using System.Collections.Generic;
using UnityEngine;public class TestChineseSegmentationHanlpHelper : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){List<SegWordStrct> segWordStrcts = ChineseSegmentationHanlpHelper.SegmentWords("今天深圳的天气如何");foreach (var word in segWordStrcts){Debug.Log($"{word.word},{word.WordAttribute}");}}
}

2、ChineseSegmentationHanlpHelper.cs

using System.Collections.Generic;
using UnityEngine;/// <summary>
/// 句子段落中文分词助手
/// </summary>
public class ChineseSegmentationHanlpHelper
{#region Datastatic AndroidJavaObject _mAndroidJavaObject;protected static AndroidJavaObject MAndroidJavaObject{get{if (_mAndroidJavaObject == null){_mAndroidJavaObject = new AndroidJavaObject("com.ffalcon.chinesesegmentationhanlphelper.HanlpHelper");}return _mAndroidJavaObject;}}#endregion/// <summary>/// 中文句子分词/// </summary>/// <param name="wordsContent">分词的内容</param>/// <returns>分词的结果</returns>public static List<SegWordStrct> SegmentWords(string wordsContent){wordsContent = wordsContent.Trim();if (string.IsNullOrEmpty(wordsContent)) return null;string[] dataArray = MAndroidJavaObject.Call<string>("segmentWork", wordsContent).Split(',');if (dataArray!=null&& dataArray.Length>0){List < SegWordStrct > rltLst = new List<SegWordStrct>();int length = dataArray.Length;for (int i = 0; i < length; i += 2){rltLst.Add(new SegWordStrct() { word= dataArray[i],WordAttribute= GetPosInfo(dataArray[i+1])});}return rltLst;}return null;}/// <summary>/// 简单获取词的属性/// </summary>/// <param name="pos">属性标签</param>/// <returns></returns>private static string GetPosInfo(string pos){// 这里你可以根据需要添加更多的判断逻辑来确定词性属性if (pos.Equals("n")){return WordAttributeStrDefine.Noun;}else if (pos.Equals("v")){return WordAttributeStrDefine.Verb;}else if (pos.Equals("ns")){return WordAttributeStrDefine.PlaceName;}else if (pos.Equals("t")){return WordAttributeStrDefine.Time;}else{return WordAttributeStrDefine.Other;}}
}/// <summary>
/// 数据分词结构
/// </summary>
public struct SegWordStrct
{public string word;public string WordAttribute;
}/// <summary>
/// 此属性文字定义
/// 较多,这里只定义了部分
/// </summary>
public class WordAttributeStrDefine {public const string Noun ="名词";public const string Verb ="动词";public const string PlaceName ="地名";public const string Time ="时间";public const string Other ="其他";
}

3、HanlpHelper.java

package com.xxxx.chinesesegmentationhanlphelper;import com.hankcs.hanlp.seg.common.Term;
import com.hankcs.hanlp.tokenizer.StandardTokenizer;import java.util.ArrayList;
import java.util.List;/*** 分词处理助手*/
public class HanlpHelper {/*** 开始分词* @param wordsContent* @return 返回分词结果,和此属性*/public String segmentWork(String wordsContent){// 进行分词List<Term> terms = StandardTokenizer.segment(wordsContent);if(terms!=null && terms.size()>0){List<String> rltWordAttr = new ArrayList<>();// 遍历分词结果,判断词性并打印for (Term term : terms) {String word = term.word;String pos = term.nature.toString();String posInfo = getPosInfo(pos); // 判断词性属性System.out.println("Word: " + word + ", POS: " + pos + ", Attribute: " + posInfo);rltWordAttr.add(word);rltWordAttr.add(pos);}String[] dataArray = rltWordAttr.toArray(new String[0]);return String.join(",", dataArray);}return null;}/*** 判断词性属性* @param pos* @return*/public String getPosInfo(String pos) {// 这里你可以根据需要添加更多的判断逻辑来确定词性属性if (pos.equals("n")) {return "名词";} else if (pos.equals("v")) {return "动词";} else if (pos.equals("ns")) {return "地名";}else if (pos.equals("t")) {return "时间";}else {return "其他";}}
}

附录:在 HanLP 中,Term 对象的 nature 字段表示词性

在 HanLP 中,Term 对象的 nature 字段表示词性(Part of Speech,POS)。HanLP 使用了一套标准的中文词性标注体系,每个词性都有一个唯一的标识符。以下是一些常见的中文词性标注及其含义:

    名词类:
        n:普通名词
        nr:人名
        ns:地名
        nt:机构名
        nz:其他专名
        nl:名词性惯用语
        ng:名词性语素

    时间类:
        t:时间词

    动词类:
        v:动词
        vd:副动词
        vn:名动词
        vshi:动词"是"
        vyou:动词"有"

    形容词类:
        a:形容词
        ad:副形词

    副词类:
        d:副词

    代词类:
        r:代词
        rr:人称代词
        rz:指示代词
        rzt:时间指示代词

    连词类:
        c:连词

    助词类:
        u:助词

    数词类:
        m:数词

    量词类:
        q:量词

    语气词类:
        y:语气词

    叹词类:
        e:叹词

    拟声词类:
        o:拟声词

    方位词类:
        f:方位词

    状态词类:
        z:状态词

    介词类:
        p:介词

    前缀类:
        h:前缀

    后缀类:
        k:后缀

    标点符号类:
        w:标点符号

请注意,上述只是一些常见的词性标注及其含义,实际情况可能更复杂。你可以根据需要调查 HanLP 的文档来了解更多词性标注的详细信息。根据这些词性标注,你可以编写代码来判断词的属性(如动词、名词、地名等)并进行相应的处理。
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/47084.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Git+Gitee使用分享

GitGitee快速入门 创建仓库 ​ ​ ​ 初始化本地仓库 验证本地git是否安装好 打开cmd窗口&#xff0c;输入git ​ 这样就OK。 Git 全局设置:(只需要设置一次) 这台电脑如果是第一次使用git&#xff0c;就需要这样初始化一下&#xff0c;这样才知道是谁提交到仓库了。 git confi…

贝锐蒲公英助力建设工程咨询企业,高效安全远程访问数据档案库

随着数字信息化进程的加深&#xff0c;数字化转型已成为企业实现业务流程自动化、提高工作效率、降低成本和提高用户满意度的重要手段。其中&#xff0c;档案工作的标准化、规范化是信息化建设的前提和必要条件&#xff0c;对于建设工程咨询企业而言&#xff0c;一个完善的数字…

服务器感染了.360勒索病毒,如何确保数据文件完整恢复?

引言&#xff1a; 随着科技的不断进步&#xff0c;互联网的普及以及数字化生活的发展&#xff0c;网络安全问题也逐渐成为一个全球性的难题。其中&#xff0c;勒索病毒作为一种危害性极高的恶意软件&#xff0c;在近年来频频袭扰用户。本文91数据恢复将重点介绍 360 勒索病毒&a…

使用vscode编写插件-php语言

https://blog.csdn.net/qq_45701130/article/details/125206645 一、环境搭建 1、安装 Visual Studio Code 2、安装 Node.js 3、安装 Git 4、安装生产插件代码的工具&#xff1a;npm install -g yo generator-code 二、创建工程 yo code 选择项解释&#xff1a; 选择编写扩…

js中的正则表达式(一)

目录 1.什么是正则表达式 2.正则表达式在JavaScript中的使用场景: 3.正则表达式的语法&#xff1a; 1.什么是正则表达式 正则表达式(Regular Expression&#xff09;是用于匹配字符串中字符组合的模式。在JavaScript中&#xff0c;正则表达式也是对象通常用来查找、替换那些符…

YOLOX在启智AI GPU/CPU平台部署笔记

文章目录 1. 概述2. 部署2.1 拉取YOLOX源码2.2 拉取模型文件yolox_s.pth2.3 安装依赖包2.4 安装yolox2.5 测试运行2.6 运行报错处理2.6.1 ImportError: libGL.so.1: cannot open shared object file: No such file or directory2.6.2 ImportError: libgthread-2.0.so.0: cannot…

MySQL 字符集概念、原理及如何配置 — 图文详解

目录 一、字符集概念 1、字符&#xff08;Character&#xff09; 2、字符编码 3、字符集&#xff08;Character set&#xff09; 二、字符集原理 1. ASCII字符集 2、GB2312 3、GBK 4、GB18030 5、BIG5 6、Unicode 编码 三、字符序 四、MySQL字符集 & 字符序 …

Linux命令200例:tar命令主要用于创建、查看和提取归档文件(常用)

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌。CSDN专家博主&#xff0c;阿里云社区专家博主&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &…

CTFhub-sql-整数注入

判断存在 sqli 注入 1 1 and 11 1 and 12 因为 11 为真&#xff0c;12 为假&#xff0c;且 11 与 1 显示的数据一样&#xff0c;那么就存在 sqli 注入 查询该数据表的字段数量 一、 2 3 1,2成功带出数据&#xff0c;3没有数据&#xff0c;所以有两个字段 二、 1 order by …

JAMstack架构:快速构建安全、高性能的现代应用

随着Web应用的快速发展&#xff0c;开发者们在寻找更加高效、安全和可维护的应用架构。JAMstack架构应运而生&#xff0c;它通过将前端、后端和部署过程分离&#xff0c;提供了一种现代化的方式来构建Web应用。在本文中&#xff0c;我们将深入探讨JAMstack架构的特点、优势以及…

【已解决】Please install Node.js and npm before continuing installation.

给juopyter lab安装插件时报这个错 原因是&#xff0c;conda本身有nodejs&#xff0c;但是版本很低&#xff0c;只有0.几 所以需要卸载掉原来的nodejs&#xff0c;重新安装10版本以上的nodejs # 卸载命令 pip uninstall nodejs # 安装命令 conda install nodejs14.7.0 -c cond…

蓝蓝设计-ui设计公司-界面设计案例作品

泛亚高科-光伏电站控制系统界面设计 html前端 | 交互设计 | 视觉设计 | 图标设计 泛亚高科(北京)科技有限公司&#xff08;以下简称“泛亚高科”&#xff09;&#xff0c;一个以实时监控、高精度数值计算为基础的科技公司&#xff0c; 自成立以来&#xff0c;组成了以博士、硕…

分布式搜索引擎----elasticsearch

目录 1、初识elasticsearch 1.1、什么是elasticsearch 1.2.ELK技术栈 2、正向索引和倒排索引 2.1、正向索引 2.2、倒排索引 2.3、正向索引和倒排索引的区别 3、elasticsearch中的概念理解 3.1、文档和字段 3.2、索引和映射 3.3、mysql与elasticsearch 1、初识elasti…

为什么选择elasticsearch分布式搜索引擎

文章目录 &#x1f52d;什么是elasticsearch&#x1f320;ELK技术栈&#x1f320;elasticsearch和lucene&#x1f320;为什么不是其他搜索技术&#xff1f; &#x1f52d;总结 &#x1f52d;什么是elasticsearch elasticsearch是一款非常强大的开源搜索引擎&#xff0c;具备非常…

SQL有关表的左连接,右连接,以及内连接

首先我们需要想一下&#xff0c;我们为什么需要将表连接在一起呢&#xff1f;换种说法&#xff0c;即我们需要查询的数据不在同一张表里面&#xff0c;而是在A表中查出一部分&#xff0c;然后再去B表中查出一部分&#xff0c;然后两者结合在一起&#xff0c;才是我们需要的部分…

动漫3D虚拟人物制作为企业数字化转型提供强大动力

一个 3D 虚拟数字人角色的制作流程&#xff0c;可以分为概念设定-3D 建模-贴图-蒙皮-动画-引擎测试六个步骤&#xff0c;涉及到的岗位有原画师、模型师、动画师等。角色概念设定、贴图绘制一般是由视觉设计师来完成;而建模、装配(骨骼绑定)、渲染动画是由三维设计师来制作完成。…

R package org.Hs.eg.db to convert gene id

文章目录 install使用org.Hs.egENSEMBL将Ensembl id convert to gene idorg.Hs.egGENENAME 将Ensembl id convert to gene nameorg.Hs.egSYMBOL 将 gene symbol convert to gene id我现在有一些ensembl id 如何转为 gene name注意你会遇到一些record不全的情况&#xff0c;gtf文…

商业智能BI是什么都不明白,如何实现数字化?

2021年下半年中国商业智能软件市场规模为4.8亿美元&#xff0c;2021年度市场规模达到7.8亿美元&#xff0c;同比增长34.9%&#xff0c;呈现飞速增长的趋势。数字化时代&#xff0c;商业智能BI对于企业的落地应用有着巨大价值&#xff0c;逐渐成为了现代企业信息化、数字化转型中…

怎么借助ChatGPT处理数据结构的问题

目录 使用ChatGPT进行数据格式化转换 代码示例 ChatGPT格式化数据提示语 代码示例 批量格式化数据提示语 代码示例 ChatGPT生成的格式化批处理代码 使用ChatGPT合并不同数据源的数据 合并数据提示语 自动合并数据提示语 ChatGPT生成的自动合并代码 结论 数据合并是…