hanlp学习四:信息抽取

一:新词提取

     a.思路:

        (1) 提取出大量文本(生语料)中的词语,无论新旧:

                      计算出左右信息熵与互信息之后,将两个指标低于一定阈值的片段过滤掉,剩下的片段按频次降序排列,截取最高频次的N个片段即完成了词语提取流程

        (2)用词典过滤掉已有的词语,于是等到新词

     b.代码:

        

# -*- coding:utf-8 -*-
# Author:hankcs
# Date: 2018-07-30 21:03
# 《自然语言处理入门》9.1 新词提取
# 配套书籍:http://nlp.hankcs.com/book.php
# 讨论答疑:https://bbs.hankcs.com/
from pyhanlp import *
import os
from pyhanlp.static import download, remove_file, HANLP_DATA_PATH
import zipfile


def test_data_path():
    """
    获取测试数据路径,位于$root/data/test,根目录由配置文件指定。
    :return:
    """
    data_path = os.path.join(HANLP_DATA_PATH, 'test')
    if not os.path.isdir(data_path):
        os.mkdir(data_path)
    return data_path


def ensure_data(data_name, data_url):
    root_path = test_data_path()
    dest_path = os.path.join(root_path, data_name)
    if os.path.exists(dest_path):
        return dest_path
    if data_url.endswith('.zip'):
        dest_path += '.zip'
    download(data_url, dest_path)
    if data_url.endswith('.zip'):
        with zipfile.ZipFile(dest_path, "r") as archive:
            archive.extractall(root_path)
        remove_file(dest_path)
        dest_path = dest_path[:-len('.zip')]
    return dest_path


HLM_PATH = ensure_data("红楼梦.txt", "http://file.hankcs.com/corpus/红楼梦.zip")
XYJ_PATH = ensure_data("西游记.txt", "http://file.hankcs.com/corpus/西游记.zip")
SHZ_PATH = ensure_data("水浒传.txt", "http://file.hankcs.com/corpus/水浒传.zip")
SAN_PATH = ensure_data("三国演义.txt", "http://file.hankcs.com/corpus/三国演义.zip")
WEIBO_PATH = ensure_data("weibo-classification", "http://file.hankcs.com/corpus/weibo-classification.zip")


def test_weibo():
    for folder in os.listdir(WEIBO_PATH):
        print(folder)
        big_text = ""
        for file in os.listdir(os.path.join(WEIBO_PATH, folder)):
            with open(os.path.join(WEIBO_PATH, folder, file)) as src:
                big_text += "".join(src.readlines())
        word_info_list = HanLP.extractWords(big_text, 100)
        print(word_info_list)


def extract(corpus):
    print("%s 热词" % corpus)
    word_info_list = HanLP.extractWords(IOUtil.newBufferedReader(corpus), 100)
    print(word_info_list)
    # print("%s 新词" % corpus)
    # word_info_list = HanLP.extractWords(IOUtil.newBufferedReader(corpus), 100, True)
    # print(word_info_list)


if __name__ == '__main__':
    extract(HLM_PATH)
    extract(XYJ_PATH)
    extract(SHZ_PATH)
    extract(SAN_PATH)
    test_weibo()

    # 更多参数
    word_info_list = HanLP.extractWords(IOUtil.newBufferedReader(HLM_PATH), 100, True, 4, 0.0, .5, 100)
    # IOUtil.newBufferedReader(HLM_PATH) reader 为文本提供数据源
    # 100 size 控制算法返回多少个词语
    # True newWordOnly 为真时,程序使用内部词库过滤掉"旧词",只返回OOV
    # 4 max_word_len 控制识别结果中最长的词语长度
    # 0.0 min_freq 控制结果中词语的最低频率,低于该频率的会被过滤
    # .5  min_entropy 控制结果中词语的最低信息熵值,一般0.5,该词越大,越短的词语就越容易被提取出来
    # 100 min_aggregation 控制结果中词语的最低互信息值,一般取50到200,该值越大,越长的词语就越容易被提取出来
    print(word_info_list)

 

二:关键词提取

       a.概念:

               提取文章中重要的单词,而不限于词语的新鲜程度,称为关键词提取

       b.分类:

             单文档算法:只需要单篇文档提取关键词 如词频统计、TextRank

             多文档算法:需要多篇文档提取关键词 如 TF-IDF

       c.词频统计:

              流程一般为分词、停用词过滤、按词频取前n个

# -*- coding:utf-8 -*-
# Author:hankcs
# Date: 2018-08-01 16:15
# 《自然语言处理入门》9.2 关键词提取
# 配套书籍:http://nlp.hankcs.com/book.php
# 讨论答疑:https://bbs.hankcs.com/
from pyhanlp import *

TermFrequency = JClass('com.hankcs.hanlp.corpus.occurrence.TermFrequency')
TermFrequencyCounter = JClass('com.hankcs.hanlp.mining.word.TermFrequencyCounter')

if __name__ == '__main__':
    counter = TermFrequencyCounter()
    counter.add("加油加油中国队!")  # 第一个文档
    counter.add("中国观众高呼加油中国")  # 第二个文档
    for termFrequency in counter:  # 遍历每个词与词频
        print("%s=%d" % (termFrequency.getTerm(), termFrequency.getFrequency()))
    print(counter.top(2))  # 取 top N

    #  根据词频提取关键词
    print(TermFrequencyCounter.getKeywordList("女排夺冠,观众欢呼女排女排女排!", 3))

       d.TF-IDF

# -*- coding:utf-8 -*-
# Author:hankcs
# Date: 2018-08-01 18:25
# 《自然语言处理入门》9.2 关键词提取
# 配套书籍:http://nlp.hankcs.com/book.php
# 讨论答疑:https://bbs.hankcs.com/
from pyhanlp import *

TfIdfCounter = JClass('com.hankcs.hanlp.mining.word.TfIdfCounter')

if __name__ == '__main__':
    counter = TfIdfCounter()
    counter.add("《女排夺冠》", "女排北京奥运会夺冠")  # 输入多篇文档
    counter.add("《羽毛球男单》", "北京奥运会的羽毛球男单决赛")
    counter.add("《女排》", "中国队女排夺北京奥运会金牌重返巅峰,观众欢呼女排女排女排!")
    counter.compute()  # 输入完毕
    for id in counter.documents():
        print(id + " : " + counter.getKeywordsOf(id, 3).toString())  # 根据每篇文档的TF-IDF提取关键词
    # 根据语料库已有的IDF信息为语料库之外的新文档提取关键词
    print(counter.getKeywords("奥运会反兴奋剂", 2))

 

       e.TextRank

 

# # -*- coding:utf-8 -*-
# Author:wancong
# Date: 2018-04-29
from pyhanlp import *


def demo_keyword(content):
    """ 关键词提取

    >>> content = (
    ...    "程序员(英文Programmer)是从事程序开发、维护的专业人员。"
    ...    "一般将程序员分为程序设计人员和程序编码人员,"
    ...    "但两者的界限并不非常清楚,特别是在中国。"
    ...    "软件从业人员分为初级程序员、高级程序员、系统"
    ...    "分析员和项目经理四大类。")
    >>> demo_keyword(content)
    [程序员, 程序, 分为, 人员, 软件]
    """
    TextRankKeyword = JClass("com.hankcs.hanlp.summary.TextRankKeyword")
    keyword_list = HanLP.extractKeyword(content, 5)
    print(keyword_list)


if __name__ == "__main__":
    import doctest
    doctest.testmod(verbose=True)

三:短语提取

         利用互信息和左右信息熵,可以将新词提取算法扩展到短语提取。只需要将新词提取时的字符替换为单词,字符串替换为单词列表

         

# # -*- coding:utf-8 -*-
# Author:wancong
# Date: 2018-04-30
from pyhanlp import *


def demo_phrase_extractor(text):
    """ 短语提取

    >>> text = '''
    ...  算法工程师
    ...  算法(Algorithm)是一系列解决问题的清晰指令,也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。
    ...  如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、
    ...  空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。算法工程师就是利用算法处理事物的人。
    ...
    ...  1职位简介
    ...  算法工程师是一个非常高端的职位;
    ...  专业要求:计算机、电子、通信、数学等相关专业;
    ...  学历要求:本科及其以上的学历,大多数是硕士学历及其以上;
    ...  语言要求:英语要求是熟练,基本上能阅读国外专业书刊;
    ...  必须掌握计算机相关知识,熟练使用仿真工具MATLAB等,必须会一门编程语言。
    ...
    ...  2研究方向
    ...  视频算法工程师、图像处理算法工程师、音频算法工程师 通信基带算法工程师
    ...
    ...  3目前国内外状况
    ...  目前国内从事算法研究的工程师不少,但是高级算法工程师却很少,是一个非常紧缺的专业工程师。
    ...  算法工程师根据研究领域来分主要有音频/视频算法处理、图像技术方面的二维信息算法处理和通信物理层、
    ...  雷达信号处理、生物医学信号处理等领域的一维信息算法处理。
    ...  在计算机音视频和图形图像技术等二维信息算法处理方面目前比较先进的视频处理算法:机器视觉成为此类算法研究的核心;
    ...  另外还有2D转3D算法(2D-to-3D conversion),去隔行算法(de-interlacing),运动估计运动补偿算法
    ...  (Motion estimation/Motion Compensation),去噪算法(Noise Reduction),缩放算法(scaling),
    ...  锐化处理算法(Sharpness),超分辨率算法(Super Resolution) 手势识别(gesture recognition) 人脸识别(face recognition)。
    ...  在通信物理层等一维信息领域目前常用的算法:无线领域的RRM、RTT,传送领域的调制解调、信道均衡、信号检测、网络优化、信号分解等。
    ...  另外数据挖掘、互联网搜索算法也成为当今的热门方向。
    ...  算法工程师逐渐往人工智能方向发展。
    ... '''
    >>> demo_phrase_extractor(text)
    [算法工程师, 算法处理, 一维信息, 算法研究, 信号处理]
    """
    phrase_list = HanLP.extractPhrase(text, 5)
    print(phrase_list)


if __name__ == "__main__":
    import doctest
    doctest.testmod(verbose=True)

 

四:关键句提取

        原理:文章的中心句往往与其他解释说明的句子 存在 较高的相似性。

# # -*- coding:utf-8 -*-
# Author:wancong
# Date: 2018-04-30
from pyhanlp import *


def demo_summary(document):
    """自动摘要

    >>> document = '''水利部水资源司司长陈明忠9月29日在国务院新闻办举行的新闻发布会上透露,
    ... 根据刚刚完成了水资源管理制度的考核,有部分省接近了红线的指标,
    ... 有部分省超过红线的指标。对一些超过红线的地方,陈明忠表示,对一些取用水项目进行区域的限批,
    ... 严格地进行水资源论证和取水许可的批准。
    ... '''
    >>> demo_summary(document)
    [严格地进行水资源论证和取水许可的批准,
    水利部水资源司司长陈明忠9月29日在国务院新闻办举行的新闻发布会上透露,
    有部分省超过红线的指标]
    """

    TextRankSentence = JClass("com.hankcs.hanlp.summary.TextRankSentence")
    sentence_list = HanLP.extractSummary(document, 3)
    print(sentence_list)


if __name__ == "__main__":
    import doctest
    doctest.testmod(verbose=True, optionflags=doctest.NORMALIZE_WHITESPACE)

 

posted @ 2020-01-25 21:38  秋华  阅读(583)  评论(0编辑  收藏  举报