zoukankan      html  css  js  c++  java
  • ansj人名识别

    1. 前言

    ansj人名识别会用到两个字典,分别是:person/asian_name_freq.data、person/person.dic。

    1.1 asian_name_freq.data

           这是一个二进制文件,序列化了一个Map对象。该对象的key为词,value是大小为3的数组。例如:罗=[[644, 40], [2048, 140, 74], [19, 28, 39, 29]],value数组各元素分别是大小为2、3、4的数组,分别表示在2字姓名、3字姓名、4字姓名中第1-2,1-3,1-4位置出现的频率(为叙述简单,本文不考虑复姓的情况)。也就是说,“罗”出现在二字姓名首位的频率是644,末位是40;出现在三字姓名首位的频率是2048,中间是140,末位是74;出现在四字姓名首位的频率是19。事实上,该Map的key可以是单字,也可能是个词,例如:高中=[[13, 2], [0, 0, 0], [0, 0, 0, 0]]这也就意味着,“高中”出现在三字姓名前两个位置(比如“高中伟”)的频率是13,出现在三字姓名后两个位置(比如“王高中”)的频率是2。

    1.2 person.dic

           该字典存储了人名的上下文环境,分为三类:11-人名的下文、12-两个中国人名之间的成分、13-可拆分为姓名的词(例如“超生”这个词,“超”字可能会和前词组成姓名)。这三类词,都会对名字的识别带来争议。

    1.3 何时触发人名识别

           对于Term类的一个实例term,如果term.termNatures().personAttr.flag为true,那就说明该term可能是人名的开头,就会触发人名识别。其中,personAttr是PersonNatureAttr(人名标注类)的实例。在PersonAttrLibrary.init2()中加载asian_name_freq.data文件时,会调用PersonNatureAttr.setlocFreq(int[][] ints)对term的姓名词频进行赋值,代码如下:
    public void setlocFreq(int[][] ints) {
        for (int i = 0; i < ints.length; i++) {
            if (ints[i][0] > 0) {
                flag = true;
                break ;
            }
        }
        locFreq = ints;
    }
        如果term可以是四字姓名或者三字姓名或者二字姓名的首字(一般情况下,这就是姓氏),personAttr.flag就会被设置为true。例如,“罗”可以是姓名首字,“高中”也可以是姓名的开头,这两个词都会触发人名识别。再如,颖=[[0, 351], [0, 712, 1071], [0, 1, 5, 13]],说明“颖”不能是姓名的开头,不会触发人名识别。也就是说,遇到可以是姓名开头的词(一般是姓氏),才会触发人名识别。这会有一个问题,比如“这里有关天培的壮烈”这句话,人名识别之前的分词结果是:[这里/r, null, 有关/vn, null, 天/q, 培/v, 的/uj, 壮烈/a, null, 末##末],“有关”不能是姓名开头,导致识别不出“关天培”。

    2. 具体实现

    ansj人名识别是以基于角色标注的中国人名自动识别研究为理论指导的,但与其又有不同。

    2.1 识别出可能的人名

        以“罗毅虎和曹罗伟是高中同学”为例:
    Result terms = ToAnalysis.parse("罗毅虎和曹罗伟是高中同学");
    System.out.println("分词结果:" + terms);
        由于“罗”是姓氏,触发人名识别,首先判断“罗毅虎和”这个四字名有没存在的可能性。“和”出现在四字姓名第四个位置的频率为0,所以不认可“罗毅虎和”这个四字姓名。然后判断“罗毅虎”这个三字姓名是否可能存在,当然这是可能的。接下来,程序并没有去判断“罗毅”这个二字名是否存在,因为“罗毅虎”是无争议的人名。所谓无争议,是指这个人名中的,没有person.dic字典里面的词。“曹罗伟”就是个有争议的人名,因为“伟”字存在于person.dic,“伟”可能是人名的下文环境,因为还要识别出“曹罗”这个二字名,随后会比较“曹罗伟”和“曹罗”哪个在此处更适合做人名。“曹罗”也是个无争议的人名,识别出来后,会直接跳过“曹罗”,从“伟”开始识别下一个人名。因此不会识别出“罗伟”这个人名。最终识别出了“罗毅虎”、“曹罗伟”、“曹罗”三个人名,如下图所示:

    2.2 计算人名概率的一些理论基础

  • 相关阅读:
    C++ MessageBox()
    magento 获取attribute的所有option
    在mangento后台调用wysiwyg编辑器
    正则式匹配数字字符串中的数字
    use magento default datepicker plugin in your project
    Colorbox cannot load the image added by js
    deal with 'non-admin area' warn
    How to use pagination in Magento
    Magento
    Magento布局layout.xml文件详解
  • 原文地址:https://www.cnblogs.com/sunfie/p/9820655.html
Copyright © 2011-2022 走看看