hankcs / HanLP

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

com.hankcs.hanlp.summary.KeywordExtractor类的shouldInclude方法,不识别一个字的词 #780

Closed freebie5 closed 4 years ago

freebie5 commented 6 years ago

注意事项

请确认下列注意事项:

版本号

当前最新版本号是:hanlp-1.6.2.jar 我使用的版本是:hanlp-1.5.4.jar

我的问题

com.hankcs.hanlp.summary.KeywordExtractor类的shouldInclude方法,为什么判断一个字的词不在计算范围内,像 霾 这个字本身就是一个词,是不是太武断了

复现问题

触发代码

public boolean shouldInclude(Term term) { // 除掉停用词 if (term.nature == null) return false; String nature = term.nature.toString(); char firstChar = nature.charAt(0); switch (firstChar) { case 'm': case 'b': case 'c': case 'e': case 'o': case 'p': case 'q': case 'u': case 'y': case 'z': case 'r': case 'w': { return false; } default: { if (term.word.trim().length() > 1 && !CoreStopWordDictionary.contains(term.word)) { return true; } } break; }

    return false;
}
hankcs commented 6 years ago

因为没有用的单字比有意义的单字的要多,所有就这么做了。现在改成了用com.hankcs.hanlp.dictionary.stopword.CoreStopWordDictionary#FILTER,可以写自己的filter。

freebie5 commented 6 years ago

请问什么时候发版本

hankcs commented 6 years ago

这个倒没有固定周期,建议自己编译,很简单的。

freebie5 commented 6 years ago

好的,但是我用maven编译的时候会报错,现在还在看什么原因,方便看一原因吗? image

hankcs commented 6 years ago

你需要跳过测试,-DskipTests

AnyListen commented 6 years ago

@hankcs 核心停用词词典包含的内容还是太广泛以至于 “大数据”这样的词都不能提取出来; 我这里有一份整理过的单字停用词,可以用于“新词发现、关键词提取、短语提取”等

private static final Set<String> cnStopWordSet = new HashSet<String>()
    {{
        add("的");
        add("是");
        add("吗");
        add("我");
        add("们");
        add("有");
        add("为");
        add("以");
        add("于");
        add("他");
        add("而");
        add("之");
        add("来");
        add("由");
        add("及");
        add("可");
        add("这");
        add("与");
        add("也");
        add("因");
        add("此");
        add("但");
        add("并");
        add("个");
        add("其");
        add("已");
        add("再");
        add("只");
        add("又");
        add("或");
        add("很");
        add("亦");
        add("某");
        add("把");
        add("那");
        add("你");
        add("乃");
        add("它");
        add("吧");
        add("被");
        add("到");
        add("尔");
        add("该");
        add("各");
        add("给");
        add("即");
        add("既");
        add("据");
        add("距");
        add("啦");
        add("了");
        add("另");
        add("么");
        add("每");
        add("嘛");
        add("哪");
        add("您");
        add("凭");
        add("且");
        add("却");
        add("让");
        add("仍");
        add("啥");
        add("谁");
        add("虽");
        add("她");
        add("哇");
        add("嗡");
        add("些");
        add("沿");
        add("哟");
        add("咱");
        add("则");
        add("怎");
        add("至");
        add("啊");
        add("要");
        add("着");
        add("等");
    }};
freebie5 commented 6 years ago

好的,安照up主的方法,maven命令:clean install -Skip Tests,编译成功 image

freebie5 commented 6 years ago

@hankcs com.hankcs.hanlp.summary.TextRankKeyword的getRank方法 /**

队列为什么超过5个就要头元素出列,为什么写死5个? 这样有点不合理,分词的结果一般都会超过5个的,这样处理每次就只能返回5个关键词了

hankcs commented 6 years ago
  1. 5是窗口大小。
  2. com.hankcs.hanlp.HanLP#extractKeyword第二个参数可以指定需要几个关键词。
freebie5 commented 6 years ago

soga,看了半天竟然看错了算法,能说一下score分数是什么原理计算出来的吗? {预警=1.0584117, 指引=0.8691174, 信号=1.0584117, 防御=1.0584117, 黄色=1.0584117, 霾=0.8691174} 类似这种,指引和霾两个score同样大小,为什么取了指引,不取霾,这句话里边的话,霾是比指引要关键的。。。

hankcs commented 6 years ago

http://www.hankcs.com/nlp/textrank-algorithm-to-extract-the-keywords-java-implementation.html

freebie5 commented 6 years ago

textrank提取关键词的算法,有个问题,那就是一句话没有重复的关键词的情况下,首尾的关键词的score一定是最小且相等的两个,例如: 霾黄色预警信号防御指引,这句话的score如下: {预警=1.0584117, 指引=0.8691174, 信号=1.0584117, 防御=1.0584117, 黄色=1.0584117, 霾=0.8691174}

freebie5 commented 6 years ago

个人觉得,score的计算还应该结合词频,用词频做完权重,词频大的,权重大

AnyListen commented 6 years ago

@freebie5 可以考虑 TF/IDF , 这样的话就需要添加一个初始化词典了

freebie5 commented 6 years ago

@AnyListen 我看了代码了,现在的流程是先分词,分词之后每个关键词都要对应的词频,我现在想把词频也结合进这个textrank算法里边,现在的textrank算法对于短的话,分词效果一般; 而且这个算法有个规律,如果一句话没有重复的关键词,那么score的分布式对称的,且score大小由中间向左右两边递减,而且左右两边的score大小是对称的

hankcs commented 6 years ago

有意思的发现,TextRank的确被很多人诟病。但事实上无监督的方法都不会按人想的标准来,有计划实现一些有监督的方法。

freebie5 commented 6 years ago

还有一个问题,博主你的java代码实现textrank算法的时候,直接用float类型计算1-d会有误差 image 应该使用BigDecimal代替计算 image

hlstudio commented 6 years ago

@freebie5 @hankcs "如果一句话没有重复的关键词,那么score的分布式对称的",短句子中TF都一样,只是由于投票迭代计算引起的差别,如果需要抑制这种差别,可以考虑把单词系列组成环再开窗迭代,这样首词的前面、尾词的后面都会有词,能减少这个影响。

freebie5 commented 6 years ago

soga,这也是一个方法,我后来没用textrank提取分词了,后来直接根据词频提取

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时代继承下来的高效率务实风范,同时冲刺前沿研究,做工业界和学术界的两栖战舰,请诸君继续多多指教,谢谢。