原理:

依托HanLP的核心词典和自定义词典根据TF*IDF算法计算
每个命名实体和名词短语的得分score,按score倒排返回前面若干个关键词

解释: TF 称为词频,表示词在一篇文档中出现的频率=词在该文档中出现的次数 / 该文档中单词的总数---TF越大,表示该词对文档越重要
DF称为文档频率,一个词在多少篇文章中出现过

本系统用的公式是:比重 k * 关键词在本文出现的次数 t / 词典中的词频 f

IDF 称为逆文档频率=Ln(总文档数/出现该次的文档数)

首先解析出标题和正文

用HanLP的分词器一句词典,初始化内容,生成一个数组 wordList,里面是分好的词,有各自的词性,和各自词在内容中所在的位置 index
把标题里的词单独分一下,降低词频 f

关键词:
先分短语:
遍历wordList,取每个词的词性和下词词性,可以组合起来的,拼接为一个短语,降低词频f,放到候选关键词数组 parsePhrase 里面
机构名不做组合
形容词,名形词,动名词,习用语,简称略语,后跟助词,名词,动词,动名词 且词的长度都大于1 则组合为短语
动词后跟助词,名词,动名词,则组合短语
名词后跟助词,名词,动名词,动词,则组合短语
数词后跟量词,名词,专有名词,或者形容词则组合短语
其余都不进行组合
组合短语长度大于8或者构成的某个单词在词库词频超过300,则此短语词频为5
其余的短语默认词频为3
再分单词:
遍历wordlist,取每个单独的词,根据词性,降低或者增加词频。同时判断是否已存在于parsePhrase的某个短语里,避免重复放入 parsePhrase。
名词,动词,形容词,长度大于2的动名词,习用语,人名,简称略语,从核心词典和扩展词典取,取不到就默认词频为3.或4
排除单字符 的关键字,去除
包含有第+数词的,词频增大
带**讯,**摄等不进行添加

所以想添加自定义词典的关键词,只需要设定为单词为名词 n,动词 v,形容词 a,长度大于2的动名词 vn,习用语 l,人名 nr,简称略语 j
在自定义词.txt里 词频 < 3 即可。

最后算分:

权重k,根据词性设定的,初始值是1,根据不同的词性 扩大或者缩小

在本文出现次数t,遍历wordList,有重复则加1即可

根据公式:比重 k * 关键词在本文出现的次数 t / 词典中的词频 f,算出parsePhrase里各个候选词的分值,排序取前N个关键词,就是要提取的

摘要:

思想:句子短,代表性强(特殊性高、分高)

复用上面的 parsePhrase 。

根据段落符号 \n 和一些标点符号 识别出标题,首段,尾段,中间的正文,以及是否是带段落编号的文章。

根据标点符号,把文章分词一个个的句子,包含每个句子的首尾位置(在文章中的前后顺序),所在段落位置(是否首段,尾段等)。
在这期间处理句子里的特殊字,词,

证明是至少含有2个段落编号的 正文文本,此时,需要去掉编号。把首段 的分值设置很大,加上标题

每个句子都分词,从parsePhrase 找出分值想加。得到每个句子的值。

对句子进行分词,找出每个词在候选关键词 数组里的分数,累加

同时对于同一句中重复出现的nr 等超过3个,进行降权

对于句子长度大于50的 进行降权

首段 FIRST 如果首句 开始位置<10(为了给去掉的记者,某报讯等等留位置)包含很多标题中词汇,
就加入摘要,其实已经在候选句子里,只不过吧分数加多一些,排名靠前点

当判定为带编号文章,增加首尾段落的分值权重

取一些特殊词作为标识,截取后面的特殊符号以后的句子内容作为句子。即去除;[记者:***] 等句子内容

等等逻辑处理完后,得到一个句子数组。先按分值大小排序

提取思想:找分高的几个句子,其总字数加起来刚刚大于要提取的摘要字数 length

length 和200有个对比
当文章字数 size <200:
当length > size 提取全文
当length < size 提取length字数的句子
当size >200
当length > 200 提取200字数的句子
当length < 200 提取length字数句子

提取后的句子,按照在文中出现的先后顺序,排序。

 

记录一下。

我: 不是圣人,做不到舍己为人; 不是痴人,做不到废寝忘食; 不是废人,做不到食不果腹; 不是庸人,做不到无所事事; 是个俗人,有七情六欲; 是个男人,有责任担当; 是个小人,有自己算盘; 是个大人,有自我奉献。 我: 一个在矛盾中不断进步的年轻人。