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

news2024/7/6 18:32:21

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 update
    void 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 Data

    static 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.coloradmin.cn/o/894014.html

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

相关文章

水泥厂人员定位方案

水泥厂人员定位方案可以采用不同的技术和策略。以下是一个常见的水泥厂人员定位方案的步骤&#xff1a; 1.选择合适的定位技术&#xff1a;根据水泥厂的需求和运营环境&#xff0c;选择适合的定位技术&#xff0c;例如基于UWB&#xff08;Ultra-Wideband&#xff09;、RFID&am…

无涯教程-Perl - undef函数

描述 此函数未定义EXPR的值。用于标量,列表,哈希,函数或类型范围。在带有诸如undef $hash {$key}之类的语句的哈希上使用&#xff1b;实际上将指定键的值设置为未定义的值。 如果要从哈希中删除元素,请使用delete函数。 语法 以下是此函数的简单语法- undef EXPRundef返回…

windows ipv4 多ip地址设置,默认网关跃点和自动跃点是什么意思?(跃点数)

文章目录 Windows中的IPv4多IP地址设置以及默认网关跃点和自动跃点的含义引言IPv4和IPv6&#xff1a;简介多IP地址设置&#xff1a;Windows环境中的实现默认网关跃点&#xff1a;概念和作用自动跃点&#xff1a;何时使用&#xff1f;关于“跃点数”如何确定应该设置多少跃点数&…

【3Ds Max】布料命令的简单使用

简介 在3ds Max中&#xff0c;"布料"&#xff08;Cloth&#xff09;是一种模拟技术&#xff0c;用于模拟物体的布料、织物或软体的行为&#xff0c;例如衣物、帆布等。通过应用布料模拟&#xff0c;您可以模拟出物体在重力、碰撞和其他外力作用下的变形和动态效果。…

【学习FreeRTOS】第11章——FreeRTOS中任务相关的其他API函数

1.函数总览 序号函数描述1uxTaskPriorityGet()获取任务优先级2vTaskPrioritySet()设置任务优先级3uxTaskGetNumberOfTasks()获取系统中任务的数量4uxTaskGetSystemState()获取所有任务的状态信息5vTaskGetInfo()获取单个任务的状态信息6xTaskGetCurrentTaskHandle()获取当前任…

利用Velero对K8S备份还原与集群迁移实战

一、简介 Velero 是一款云原生时代的灾难恢复和迁移工具&#xff0c;采用 Go 语言编写&#xff0c;并在 github 上进行了开源&#xff0c;利用 velero 用户可以安全的备份、恢复和迁移 Kubernetes 集群资源和持久卷。 开源地址&#xff1a;https://github.com/vmware-tanzu/v…

Element通过v-for循环渲染的form表单校验

需求&#xff1a;有个表单信息是v-for渲染的&#xff0c;例如下图&#xff0c;通过循环遍历实现新增和删除模块&#xff0c;按照平时的写法实现校验&#xff0c;是不能实现我们想要的效果&#xff0c;根据这个需求&#xff0c;我找到了一个解决方法 1.HTML <el-form ref&qu…

【抓包工具】whistle抓包工具分享

一、使用场景 抓包请求转发 二、基础篇 官网&#xff1a;http://wproxy.org/whistle/ github: https://github.com/avwo/whistle 简介&#xff1a; whistle(读音[ˈwɪsəl]&#xff0c;拼音[wēisǒu])基于Node实现的跨平台web调试代理工具&#xff0c;类似的工具有Window…

React 之 Router - 路由详解

一、Router的基本使用 1. 安装react-router react-router会包含一些react-native的内容&#xff0c;web开发并不需要 npm install react-router-dom 2. 设置使用模式 BrowserRouter或HashRouter Router中包含了对路径改变的监听&#xff0c;并且会将相应的路径传递给子组件Bro…

优化视频流:利用美颜SDK提升直播质量的方法

随着互联网的迅猛发展&#xff0c;视频直播已成为人们分享、交流和娱乐的重要方式。然而&#xff0c;在实际的直播过程中&#xff0c;视频画质可能受到诸多因素的影响&#xff0c;例如摄像头品质、网络状况等。为了提升观众的体验和吸引更多的观众&#xff0c;美颜技术逐渐成为…

8.18号transformer 系列文章阅读

文章目录 STGM: Spatio-Temporal Graph Mixformer for Traffic ForecastingAttention Is Not All You Need AnymoreLEARNING IMAGE DERAINING TRANSFORMER NETWORK WITH DYNAMIC DUAL SELF-ATTENTIONSST: A Simplified Swin Transformer-based Model for Taxi Destination Pred…

zookeeper安装配置采坑流程

安装 wget https://dlcdn.apache.org/zookeeper/zookeeper-3.8.2/apache-zookeeper-3.8.2-bin.tar.gz解压&#xff1a; tar -zxvf apache-zookeeper-3.8.2-bin.tar.gz如下 bin目录下文件是可执行文件 conf目录文件是配置文件 修改zoo.cfg&#xff08;复制zoo_sample&#x…

python生成器有几种写法,python生成器函数例子

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;python生成器有几种写法&#xff0c;python生成器函数例子&#xff0c;今天让我们一起来看看吧&#xff01; 本文部分参考&#xff1a;Python迭代器&#xff0c;生成器–精华中的精华 https://www.cnblogs.com/deeper/p…

C#接化发:串口通信

文章目录 框架准备串口准备接、化、发测试 源码地址&#xff1a;C# 串口通信测试软件 框架准备 出于简单考虑&#xff0c;首先创建一个Winform项目&#xff0c;本文项目名称为portTest。 串口通信&#xff0c;至少有两个串口才能通信&#xff0c;所以拖动两个GroupBox&#…

Python 3 使用Hive 总结

启动HiveServer2 服务 HiveServer2 是一种可选的 Hive 内置服务&#xff0c;可以允许远程客户端使用不同编程语言向 Hive 提交请求并返回结果。 Thrift服务配置 假设我们已经成功安装了 Hive&#xff0c;如果没有安装&#xff0c;请参考&#xff1a;Hive 一文读懂 。在启动 H…

SAP后台表SE16和SE16N修改后台表数据方法

SAP后台表SE16和SE16N修改后台表数据方法 SAP中直接修改表、视图的Tcode有SE16N和SM30。 一 . SE16N界面输入&SAP_EDIT 其中使用SE16N修改表需要先输入命令&SAP_EDIT,回车左下角显示激活SAP编辑功能后&#xff0c;就可以对相应的表进行新增、删除、修改的操作。 有…

剑指offer44.数字序列中某一位的数字

最后一道题&#xff0c;我一定要自己做出来&#xff0c;想了不到一个小时想法差不多成熟了&#xff0c;但是有一个小细节出问题了&#xff0c;这个问题我在idea上debug都没debug出来。我先讲我的题解然后再讲我这个小问题出在哪里吧。以下是我的代码&#xff1a; class Soluti…

基于.Net Core开发的医疗信息LIS系统源码

SaaS模式.Net Core版云LIS系统源码 医疗信息LIS系统是专为医院检验科设计的一套实验室信息管理系统&#xff0c;能将实验仪器与计算机组成网络&#xff0c;使病人样品登录、实验数据存取、报告审核、打印分发&#xff0c;实验数据统计分析等繁杂的操作过程实现了智能化、自动化…

Mac m1芯片基于parallesls desktop安装Ubuntu

1.Ubuntu镜像下载 访问Ubuntu官网自行选择版本进行下载&#xff0c;可进行以下操作进行版本选择 对于Mac系统&#xff0c;不论VM/PD都需要用arm架构镜像&#xff0c;所以点击arm架构的镜像进行下载 2.准备PD PD安装包&#xff1a; 链接&#xff1a;https://pan.quark.cn/s/46…

深入了解Maven

目录 一.Maven介绍与功能 二.依赖管理 1.依赖的配置 2.依赖的传递性 3.排除依赖 4.依赖的作用范围 一.Maven介绍与功能 maven是一个项目管理和构建工具&#xff0c;是基于对象模型POM实现。 Maven的作用&#xff1a; 便捷的依赖管理&#xff1a;使用Maven可以简化依赖管…