一种带词性标注的分词器使用方法--HanLP分词

HanLP的官方简介如下:
HanLP是一系列模型与算法组成的NLP工具包,目标是普及自然语言处理在生产环境中的应用。HanLP具备功能完善、性能高效、架构清晰、语料时新、可自定义的特点。内部算法经过工业界和学术界考验,配套书籍《自然语言处理入门》已经出版。目前,基于深度学习的HanLP 2.0正处于alpha测试阶段,未来将实现知识图谱、问答系统、自动摘要、文本语义相似度、指代消解、三元组抽取、实体链接等功能。
HanLP的功能包括:
中文分词、词性标注、命名实体识别、关键词提取、短语提取、拼音转换、简繁转换、文本推荐、依存句法分析、文本分类、文本聚类、向量提取等。

更多更全面的使用方法,请参考github上的介绍。

这里仅介绍本人使用过的功能:带词性标注的分词(自定义词库)
1、下载 data.zip
下载后解压到任意目录,接下来通过配置文件告诉HanLP数据包的位置。
HanLP中的数据分为词典和模型,其中词典是词法分析必需的,模型是句法分析必需的。

data
│
├─dictionary
└─model

用户可以自行增删替换,如果不需要句法分析等功能的话,随时可以删除model文件夹。由于model文件夹有1G多,分词功能不依赖它,可以直接删除。
2、下载jar和配置文件:hanlp-release.zip
解压后得到如下三个文件:
在这里插入图片描述
其中hanlp.properties是配置文件,配置文件的作用是告诉HanLP数据包的位置,只需修改第一行。

root=D:/develop/HanLP/

此路径为data的父目录即可,比如data目录是/Users/hankcs/Documents/data,那么root=/Users/hankcs/Documents/ 。
最后将hanlp.properties放入classpath即可,对于多数项目,都可以放到src或resources目录下,编译时IDE会自动将其复制到classpath中。除了配置文件外,还可以使用环境变量HANLP_ROOT来设置root。
然后将两个jar引入项目依赖,就可以开始编写代码了。
3、自定义词典的分词功能的使用方法
其实分词功能可以通过两中方法实现:
3.1 在代码中实现

import com.hankcs.hanlp.HanLP;
import com.hankcs.hanlp.dictionary.CustomDictionary;
import com.hankcs.hanlp.seg.Segment;
import com.hankcs.hanlp.seg.common.Term;

import java.util.List;

/**
 * 在代码中自定义词性
 */
public class HanlpTest1 {
    public static void main(String[] args) {
        // 自定义词典:第一个参数是单词,第二个参数是词性和词频,词频可以随意给个数字
        CustomDictionary.insert("白富美", "bfm 100");
        // 用户自定义词典强制生效
        Segment segment = HanLP.newSegment().enableCustomDictionaryForcing(true);
        // 开始分词
        List<Term> termList = segment.seg("白富美逆袭高富帅");
        // 打印词性和分词结果
        for (Term term : termList) {
            System.out.println(term.nature.toString() + " " + term.word);
        }
    }
}

执行结果:
一种带词性标注的分词器使用方法--HanLP分词_第1张图片
3.2 在配置文件中指定自定义词典与词性
将相同词性的单词放入一个txt文件中,一行一个单词。例如:我的自定义词典.txt
一种带词性标注的分词器使用方法--HanLP分词_第2张图片
然后将这个文件放入HanlpData/data/dictionary/custom/下:
一种带词性标注的分词器使用方法--HanLP分词_第3张图片
在hanlp.properties中追加自定义词典路径,用;隔开多个自定义词典,空格开头表示在同一个目录,使用“文件名 词性”形式则表示这个词典的词性。优先级递减。
一种带词性标注的分词器使用方法--HanLP分词_第4张图片
然后开始测试效果:

import com.hankcs.hanlp.HanLP;
import com.hankcs.hanlp.seg.Segment;
import com.hankcs.hanlp.seg.common.Term;

import java.util.List;

/**
 * Hanlp分词工具测试类
 */
public class HanlpTest {
    public static void main(String[] args) {

        // 用户自定义词典强制生效
        Segment segment = HanLP.newSegment().enableCustomDictionaryForcing(true);
        // 开始分词
        List<Term> termList = segment.seg("新冠肺炎是2020年1月开始流行的,明伟家具武汉加油");
        // 打印词性和分词结果
        for (Term term : termList) {
            System.out.println(term.nature.toString() + " " + term.word);
        }
    }
}

程序输出:
一种带词性标注的分词器使用方法--HanLP分词_第5张图片
扩展说明:HanLP的默认词性
4、在hadoop上运行HanLP
HanLP默认是在本地文件系统上运行的,如果要hadoop上运行,需要自定义IO适配器:

import com.hankcs.hanlp.corpus.io.IIOAdapter;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

/**
 * 自定义文件适配器,让HanLP能在hadoop上运行
 */
public class HDFSIOAdapter implements IIOAdapter {


    /**
     * 获取文件系统
     *
     * @return FileSystem
     */
    private FileSystem getFS() {
        FileSystem fs = null;
        Configuration conf = new Configuration();
        // 如果在yarn上运行,这里不需要配置连接信息
        //    conf.set("fs.defaultFS", "hdfs://192.168.1.1:9000")
        //    conf.set("dfs.replication", "3")
        try {
            fs = FileSystem.get(conf);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return fs;
    }

    @Override
    public InputStream open(String path) throws IOException {
        // 从hdfs获取输入流
        FileSystem fs = getFS();
        return fs.open(new Path(path));
    }

    @Override
    public OutputStream create(String path) throws IOException {
        FileSystem fs = getFS();
        return fs.create(new Path(path));
    }
}

然后修改hanlp.properties配置文件,指定自定义适配器的全限定类名:

#IO适配器,实现com.hankcs.hanlp.corpus.io.IIOAdapter接口以在不同的平台(Hadoop、Redis等)上运行HanLP
#默认的IO适配器如下,该适配器是基于普通文件系统的。
IOAdapter=com.learn.hanlp.HDFSIOAdapter

再将data包上传到hdfs,使所有节点都可以访问到数据,修改配置文件,将root改为hdfs的路径:

root=hdfs://spark/HanlpData/

这样hanlp就可以在hadoop上运行了

你可能感兴趣的:(一种带词性标注的分词器使用方法--HanLP分词)