hankcs / HanLP

中文分词 词性标注 命名实体识别 依存句法分析 成分句法分析 语义依存分析 语义角色标注 指代消解 风格转换 语义相似度 新词发现 关键词短语提取 自动摘要 文本分类聚类 拼音简繁转换 自然语言处理
https://hanlp.hankcs.com/
Apache License 2.0
33.77k stars 10.1k forks source link

1.5.0 新词发现特性OutOfMemory,discovery函数读取语料字符串,是否可以提供流式管道作为参数的discovery函数 #667

Closed chunpingji closed 4 years ago

chunpingji commented 6 years ago

注意事项

请确认下列注意事项:

版本号

当前最新版本号是:1.5.0 我使用的版本是:1.5.0

我的问题

使用1.5.0版本新增加的特性:新词发现。输入语料文件大小90M,出现OutOfMemory

复现问题

    NewWordDiscover nd = new NewWordDiscover(4, 0.00005f, .6f, 0.2f, true);
    try {
        List<com.hankcs.hanlp.mining.word.WordInfo> newWords =nd.discovery(this.read("/content/discuss_content.txt"), 100);

        System.out.println(newWords);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

步骤

  1. 首先,构造NewWordDiscover对象,参数:4, 0.00005f, .6f, 0.2f, true
  2. 然后,从文件中读取语料,语料文件约90M

    private String read(String fileName) throws IOException {
        StringBuffer result = new StringBuffer();
        BufferedReader  br = new BufferedReader(new FileReader(new File(fileName)));
    
        String s = null;
        while((s = br.readLine())!=null){
            result.append(System.lineSeparator()+s);
        }
        br.close(); 
        return result.toString();
    }
  3. 接着,运行10分钟左右后报OutOfMemory

触发代码

    private static void increaseFrequency(char c, Map<Character, int[]> storage)
    {
        int[] freq = storage.get(c);
        if (freq == null)
        {
            freq = new int[]{1};
            storage.put(c, freq);  // <-- 触发OutOfMemory
        }
        else
        {
            ++freq[0];
        }
    }

期望输出

正常输出新词结果,不报错

实际输出

抛出OutOfMemory异常

其他信息

JVM内存大小设置:-Xmx4096M -Xms4096M

建议

期望在语料较大时,能通过流读取语料文件,防止一次性加载撑爆内存

hankcs commented 6 years ago

的确有这个改进空间,一次事实上只需要读取一个窗口进来,不断地滑动窗口。等我有空了会试着改进一下。

hankcs commented 4 years ago

感谢您对HanLP1.x的支持,我一直为没有时间回复所有issue感到抱歉,希望您提的问题已经解决。或者,您可以从《自然语言处理入门》中找到答案。

时光飞逝,HanLP1.x感谢您的一路相伴。我于东部标准时间2019年12月31日发布了HanLP1.x在上一个十年最后一个版本,代号为最后的武士。此后1.x分支将提供稳定性维护,但不是未来开发的焦点。

值此2020新年之际,我很高兴地宣布,HanLP2.0发布了。HanLP2.0的愿景是下一个十年的前沿NLP技术。为此,HanLP2.0采用TensorFlow2.0实现了最前沿的深度学习模型,通过精心设计的框架支撑下游NLP任务,在海量语料库上取得了最前沿的准确率。作为第一个alpha版本,HanLP 2.0.0a0支持分词、词性标注、命名实体识别、依存句法分析、语义依存分析以及文本分类。而且,这些功能并不仅限中文,而是面向全人类语种设计。HanLP2.0提供许多预训练模型,而终端用户仅需两行代码即可部署,深度学习落地不再困难。更多详情,欢迎观看HanLP2.0的介绍视频,或参与论坛讨论

展望未来,HanLP2.0将集成1.x时代继承下来的高效率务实风范,同时冲刺前沿研究,做工业界和学术界的两栖战舰,请诸君继续多多指教,谢谢。