/*
 * <author>Hankcs</author>
 * <email>me@hankcs.com</email>
 * <create-date>2018-03-15 下午5:39</create-date>
 *
 * <copyright file="DemoPerceptronLexicalAnalyzer.java" company="码农场">
 * Copyright (c) 2018, 码农场. All Right Reserved, http://www.hankcs.com/
 * This source is subject to Hankcs. Please contact Hankcs to get more information.
 * </copyright>
 */
package com.hankcs.demo;

import com.hankcs.hanlp.HanLP;
import com.hankcs.hanlp.corpus.document.sentence.Sentence;
import com.hankcs.hanlp.corpus.document.sentence.word.IWord;
import com.hankcs.hanlp.corpus.document.sentence.word.Word;
import com.hankcs.hanlp.model.perceptron.PerceptronLexicalAnalyzer;
import com.hankcs.hanlp.utility.TestUtility;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * 基于感知机序列标注的词法分析器，可选多个模型。
 * - large训练自一亿字的大型综合语料库，是已知范围内全世界最大的中文分词语料库。
 * - pku199801训练自个人修订版1998人民日报语料1月份，仅有183万字。
 * 语料库规模决定实际效果，面向生产环境的语料库应当在千万字量级。欢迎用户在自己的语料上训练新模型以适应新领域、识别新的命名实体。
 * 无论在何种语料上训练，都完全支持简繁全半角和大小写。
 *
 * @author hankcs
 */
public class DemoPerceptronLexicalAnalyzer extends TestUtility
{
    public static void main(String[] args) throws IOException
    {
        PerceptronLexicalAnalyzer analyzer = new PerceptronLexicalAnalyzer(HanLP.Config.PerceptronCWSModelPath,
                                                                           HanLP.Config.PerceptronPOSModelPath,
                                                                           HanLP.Config.PerceptronNERModelPath);
        //System.out.println(analyzer.analyze("上海华安工业（集团）公司董事长谭旭光和秘书胡花蕊来到美国纽约现代艺术博物馆参观").translateLabels());
        //System.out.println(analyzer.analyze("微软公司於1975年由比爾·蓋茲和保羅·艾倫創立，18年啟動以智慧雲端、前端為導向的大改組。").translateLabels());
        String text = "今年来，城陵矶新港区已有岳阳钟鼎热工质押的17件专利获得中国光大银行放款500万元，哈工智能获批光大银行知识产权质押放款200万元。目前区内还有西爱斯、哈工三维等5家企业超过1500万元的贷款正在审批中。";
        // 任何模型总会有失误，特别是98年这种陈旧的语料库
        System.out.println(analyzer.analyze(text));
        //System.out.println(analyzer.seg2sentence("总统普京与特朗普通电话讨论太空探索技术公司"));
        // 支持在线学习
        List<IWord> wordList = new ArrayList<>();
        Word word = new Word(null,null);
        word.setLabel("中国光大银行");
        word.setValue("nt");
        wordList.add(word);
        Sentence sentence = new Sentence(wordList);
        //analyzer.learn(sentence);

        // 学习到新知识
        System.out.println(HanLP.newSegment().seg2sentence(text));

        // 还可以举一反三
        //System.out.println(analyzer.analyze("主席和特朗普通电话"));

        // 知识的泛化不是死板的规则，而是比较灵活的统计信息
        //System.out.println(analyzer.analyze("我在浙江金华出生"));
        //analyzer.learn("在/p 浙江/ns 金华/ns 出生/v");
        //System.out.println(analyzer.analyze("我在四川金华出生，我的名字叫金华"));

        // 在线学习后的模型支持序列化，以分词模型为例：
        //analyzer.getPerceptronSegmenter().getModel().save(HanLP.Config.PerceptronCWSModelPath);
        //analyzer.getPerceptronPOSTagger().getModel().save(HanLP.Config.PerceptronPOSModelPath);
        //analyzer.getPerceptionNERecognizer().getModel().save(HanLP.Config.PerceptronNERModelPath);
        // 请用户按需执行对空格制表符等的预处理，只有你最清楚自己的文本中都有些什么奇怪的东西
//        System.out.println(analyzer.analyze("空格 \t\n\r\f&nbsp;统统都不要"
//                                                .replaceAll("\\s+", "")    // 去除所有空白符
//                                                .replaceAll("&nbsp;", "")  // 如果一些文本中含有html控制符
//        ));
    }
}
