Closed freebie5 closed 4 years ago
因为没有用的单字比有意义的单字的要多,所有就这么做了。现在改成了用com.hankcs.hanlp.dictionary.stopword.CoreStopWordDictionary#FILTER
,可以写自己的filter。
请问什么时候发版本
好的,但是我用maven编译的时候会报错,现在还在看什么原因,方便看一原因吗?
你需要跳过测试,-DskipTests
@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("等");
}};
好的,安照up主的方法,maven命令:clean install -Skip Tests,编译成功
@hankcs com.hankcs.hanlp.summary.TextRankKeyword的getRank方法 /**
@return
/
public Map<String, Float> getRank(List
return score;
}
队列为什么超过5个就要头元素出列,为什么写死5个? 这样有点不合理,分词的结果一般都会超过5个的,这样处理每次就只能返回5个关键词了
soga,看了半天竟然看错了算法,能说一下score分数是什么原理计算出来的吗? {预警=1.0584117, 指引=0.8691174, 信号=1.0584117, 防御=1.0584117, 黄色=1.0584117, 霾=0.8691174} 类似这种,指引和霾两个score同样大小,为什么取了指引,不取霾,这句话里边的话,霾是比指引要关键的。。。
textrank提取关键词的算法,有个问题,那就是一句话没有重复的关键词的情况下,首尾的关键词的score一定是最小且相等的两个,例如: 霾黄色预警信号防御指引,这句话的score如下: {预警=1.0584117, 指引=0.8691174, 信号=1.0584117, 防御=1.0584117, 黄色=1.0584117, 霾=0.8691174}
个人觉得,score的计算还应该结合词频,用词频做完权重,词频大的,权重大
@freebie5 可以考虑 TF/IDF , 这样的话就需要添加一个初始化词典了
@AnyListen 我看了代码了,现在的流程是先分词,分词之后每个关键词都要对应的词频,我现在想把词频也结合进这个textrank算法里边,现在的textrank算法对于短的话,分词效果一般; 而且这个算法有个规律,如果一句话没有重复的关键词,那么score的分布式对称的,且score大小由中间向左右两边递减,而且左右两边的score大小是对称的
有意思的发现,TextRank的确被很多人诟病。但事实上无监督的方法都不会按人想的标准来,有计划实现一些有监督的方法。
还有一个问题,博主你的java代码实现textrank算法的时候,直接用float类型计算1-d会有误差 应该使用BigDecimal代替计算
@freebie5 @hankcs "如果一句话没有重复的关键词,那么score的分布式对称的",短句子中TF都一样,只是由于投票迭代计算引起的差别,如果需要抑制这种差别,可以考虑把单词系列组成环再开窗迭代,这样首词的前面、尾词的后面都会有词,能减少这个影响。
soga,这也是一个方法,我后来没用textrank提取分词了,后来直接根据词频提取
感谢您对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时代继承下来的高效率务实风范,同时冲刺前沿研究,做工业界和学术界的两栖战舰,请诸君继续多多指教,谢谢。
注意事项
请确认下列注意事项:
版本号
当前最新版本号是: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; }