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 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 的文档来了解更多词性标注的详细信息。根据这些词性标注,你可以编写代码来判断词的属性(如动词、名词、地名等)并进行相应的处理。
 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

课程项目设计--项目建立--宿舍管理系统--springboot后端

前要 项目设计–宿舍管理系统 文章目录 项目建立导入依赖配置文件配置目录结构config配置mybatis-plusswagger 生成实体、mapper和servicebaseEntity统一响应实例响应码接口响应码接口实现统一响应result统一分页响应 项目建立 太长了&#xff0c;修改一下 导入依赖 暂时先加…

echarts 饼图 值为0时页面显示undefined%的解决方案

当饼图的数据为0时&#xff0c;页面会出现 undefined% 的情况 值为0的数据&#xff1a; pieData: [{name: 分类一,value: 0,},{name: 分类二,value: 0,}, ], //饼图数据 页面显示为undefined% 我们可以通过 label 的 formatter 来进行自定义调整&#xff0c;具体点就是在 fo…

蓝海创意云×悦乐兔99艺术节直播首秀顺利开播

8月18日&#xff0c;苏州悦乐兔99艺术节直播首秀顺利开播&#xff0c;蓝海创意云为此次直播提供了全程技术支持&#xff0c;使用自主研发的vLive虚拟直播系统嵌入整个直播流程&#xff0c;带给观众一场不一样的全新视觉体验。 蓝海创意云x悦乐兔直播首秀顺利开播 蓝海创意云助力…

MySQL语法及常用数据类型

一、SQL语言概述 对数据库进行查询和修改操作的语言叫做SQL。SQL的含义就是结构化查询语言&#xff08;Structured Query Language&#xff09;。SQL包含以下4个部分&#xff1a; 1、数据定义语言&#xff08;DDL&#xff09;&#xff1a;DROP、CREATE、ALTER等语句&#xff…

问道管理:沪指弱势震荡跌0.38%,金融、地产等板块走弱,算力概念等活跃

21日早盘&#xff0c;沪指盘中弱势震荡下探&#xff0c;创业板指一度跌逾1%失守2100点&#xff1b;北向资金小幅净流出。 截至午间收盘&#xff0c;沪指跌0.38%报3120.18点&#xff0c;深成指跌0.24%&#xff0c;创业板指跌0.62%&#xff1b;两市算计成交4238亿元&#xff0c;…

电脑找不到MSVCR120.dll怎么办?MSVCR120.dll是什么?

在我们的日常生活和工作中&#xff0c;电脑故障是难以避免的问题。而MSVCR120.dll文件是Windows系统中的一个重要组件&#xff0c;如果出现损坏或丢失&#xff0c;可能会导致程序无法正常运行&#xff0c;这个问题可能是由于系统文件损坏、病毒感染等原因导致的。因此&#xff…

神经网络改进:注重空间变化,权重参数调整,正则化, 熵的简单理解

目录 神经网络改进&#xff1a;注重空间变化 将高纬空间映射到地位空间便于表示&#xff08;供给数据&#xff09; 将地位空间映射到高纬空间进行分类聚合&#xff08;达到可分状态&#xff08;K-means&#xff09;&#xff09; 神经网络改进&#xff1a;权重参数调整 自注…

Android Drawable转BitmapDrawable再提取Bitmap,Kotlin

Android Drawable转BitmapDrawable再提取Bitmap&#xff0c;Kotlin <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"…

基于PaddlePaddle实现的声纹识别系统

前言 本项目使用了EcapaTdnn、ResNetSE、ERes2Net、CAM等多种先进的声纹识别模型&#xff0c;不排除以后会支持更多模型&#xff0c;同时本项目也支持了MelSpectrogram、Spectrogram、MFCC、Fbank等多种数据预处理方法&#xff0c;使用了ArcFace Loss&#xff0c;ArcFace loss…

记录首次面试2023-08-18

人生第一次面试&#xff0c;大概一个小时左右。没有问我C的&#xff0c;上来一个数据库事务&#xff0c;虽然没有复习&#xff0c;但是还是能够记住一些&#xff0c;主要问的一些事务的隔离级别&#xff0c;以及都有什么作用&#xff0c;我是举例回答的&#xff0c;客户端A和客…

[Go版]算法通关村第十三关青铜——数字数学问题之统计问题、溢出问题、进制问题

这里写自定义目录标题 数字统计专题题目&#xff1a;数组元素积的符号思路分析&#xff1a;无需真计算&#xff0c;只需判断负数个数是奇是偶复杂度&#xff1a;时间复杂度 O ( n ) O(n) O(n)、空间复杂度 O ( 1 ) O(1) O(1)Go代码 题目&#xff1a;阶乘尾数0的个数思路分析&am…

高忆管理:市盈率一般多少合理?

市盈率&#xff08;PE Ratio&#xff09;是衡量一只股票估值水平的重要目标&#xff0c;其计算公式为股票当前市价除以每股收益。一般来说&#xff0c;市盈率较低的股票被认为是具有出资价值的好股票&#xff0c;而市盈率较高的股票则或许被认为是过度投机或者受商场热潮影响的…

我国55个少数民族及主要分布地区

声明&#xff1a;来源网络&#xff0c;仅供学习&#xff01;

漏洞指北-VulFocus靶场专栏-中级02

漏洞指北-VulFocus靶场专栏-中级02 中级005 &#x1f338;thinkphp lang 命令执行&#xff08;thinkphp:6.0.12&#xff09;&#x1f338;step1&#xff1a;burp suite 抓包 修改请求头step2 修改成功&#xff0c;访问shell.php 中级006 &#x1f338;Metabase geojson任意文件…

商用汽车转向系统常见故障解析

摘要&#xff1a; 车辆转向系统是用于改变或保持汽车行驶方向的专门机构。其作用是使汽车在行驶过程中能按照驾驶员的操纵意图而适时地改变其行驶方向&#xff0c;并在受到路面传来的偶然冲击及车辆意外地偏离行驶方向时&#xff0c;能与行驶系统配合共同保持车辆继续稳定行驶…

构建 NodeJS 影院预订微服务并使用 docker 部署(03/4)

一、说明 构建一个微服务的电影网站&#xff0c;需要Docker、NodeJS、MongoDB&#xff0c;这样的案例您见过吗&#xff1f;如果对此有兴趣&#xff0c;您就继续往下看吧。 你好社区&#xff0c;这是&#x1f3f0;“构建 NodeJS 影院微服务”系列的第三篇文章。本系列文章演示了…

敏感信息泄露

由于后台人员的疏忽或者不当的设计&#xff0c;导致不应该被前端用户看到的数据被轻易的访问到。 比如&#xff1a; —通过访问url下的目录&#xff0c;可以直接列出目录下的文件列表; —输入错误的url参数后报错信息里面包含操作系统、中间件、开发语言的版本或其他信息; —前…

不同企业如何选择合适的CRM系统?

市场上的CRM系统千差万别&#xff0c;如何选到适合的CRM系统&#xff1f;很多企业凭借感觉盲目选型&#xff0c;结果上线后发现CRM系统功能不符合需求。这就好比买衣服&#xff0c;不试穿就买回家&#xff0c;结果发现尺码不合适&#xff0c;还不能退换。下面说说企业如何进行C…

恒运资本:信创概念再度活跃,华是科技再创新高,南天信息等涨停

信创概念21日盘中再度活跃&#xff0c;截至发稿&#xff0c;华是科技涨超17%&#xff0c;盘中一度触及涨停再创新高&#xff0c;中亦科技涨超13%亦创出新高&#xff0c;久其软件、南天信息、新炬网络、英飞拓均涨停。 音讯面上&#xff0c;自8月3日以来&#xff0c;财政部官网连…

async/await 编程理解

博客主要是参考 Asynchronous Programming in Rust &#xff0c;会结合简单的例子&#xff0c;对 async 和 await 做比较系统的理解&#xff0c;如何使用 async 和 await 是本节的重点。 async 和 await 主要用来写异步代码&#xff0c;async 声明的代码块实现了 Future 特性&a…