• NLP(八) 创建自然语言处理管道


    原文链接:http://www.one2know.cn/nlp8/

    • 一条管道可以被看作一个多阶段的数据流系统,其中一个组件的输出被视为另一个组件的输入
    • 管道特点:
    1. 数据始终从一个组件流向另一个组件
    2. 组件是一个只考虑输入和输出数据的黑盒
    • NLP管道应有的功能:
    1. 采集输入数据
    2. 对输入数据进行分词
    3. 识别输入数据中单词的词性
    4. 从单词中抽取命名实体
    5. 识别命名实体之间的关系
    import nltk
    import threading # 轻量级任务的线程库
    import queue #可在多线程程序中使用的队列库
    import feedparser # RSS源解析库
    import uuid # 基于RFC-4122的uuid版本1,3,4,5的生成库
    
    threads = [] # 创建一个空列表来跟踪程序中的所有线程
    queues = [queue.Queue(),queue.Queue()] # 创建一个包含两个队列对象的列表
    # 第一个队列:存储分词后的句子
    # 第二个队列:存储所有标注过词性的单词
    
    def extractWords():
        url = 'http://sports.yahoo.com/mlb/rss.xml'
        feed = feedparser.parse(url)
        for entry in feed['entries'][:5]:
            text = entry['title'] # 标题存到text里
            if 'ex' in text: # 跳过包含敏感词的标题,有ex存在就不处理了
                continue
            words = nltk.word_tokenize(text) # 将标题分词
            data = {'uuid':uuid.uuid4(),'input':words} # 两个键值对,存储UUID和输入的单词
            queues[0].put(data,True) # 将字典放到第一个队列
            print(">> {} : {}".format(data['uuid'],text))
    
    # 从第一个队列读取数据,并处理数据,将这些单词的词性保存在第二个队列中
    def extractPOS():
        while True: # 无限循环,直到第一个队列为空
            if queues[0].empty():
                break
            else:
                data = queues[0].get()
                words = data['input']
                postags = nltk.pos_tag(words)
                queues[0].task_done() # 已经处理完毕由此线程获取的条目
                # 将标注词性的单词列表存储在第二个队列
                queues[1].put({'uuid':data['uuid'],'input':postags},True)
    
    # 从第二个队列读取数据,即处理标注词性后的词,并在屏幕打印命名实体
    def extractNE():
        while True: # 无限循环,直到第二个队列为空
            if queues[1].empty():
                break
            else:
                data = queues[1].get()
                postags = data['input']
                queues[1].task_done()
                # 将postags中的命名实体抽取出来存入chunks中
                chunks = nltk.ne_chunk(postags,binary=False)
                print(" << {} : ".format(data['uuid']),end='')
                for path in chunks:
                    try:
                        label = path.label()
                        print(path,end=', ')
                    except:
                        pass
                print()
    
    def runProgram():
        # 启动该线程,并将该线程放到队列
        e = threading.Thread(target=extractWords())
        e.start()
        threads.append(e)
    
        p = threading.Thread(target=extractPOS())
        p.start()
        threads.append(p)
    
        n = threading.Thread(target=extractNE())
        n.start()
        threads.append(n)
    
        # 将在所有工作处理完毕后释放分配给queues资源
        queues[0].join()
        queues[1].join()
    
        # 遍历线程列表,将当前的线程对象存储在t中
        for t in threads:
            t.join() # 标记线程的完成,并释放分配给线程的资源
    
    if __name__ == "__main__":
        runProgram()
    

    输出:

    >> be849c82-41cf-4e98-ac32-9766a199e763 : The Bandwagon: All-Stars, America and more
    >> 690c174d-a365-4b8a-8712-abd222f13902 : Cards regain power, look for series win vs. Mariners
    >> e75f4270-8922-4eab-b688-69e34e387c6f : Yankees look to continue success against Rays
    >> f829392a-3702-45bb-bff8-d35261dfa03b : Recap: STL 5, SEA 2
    >> ad953f96-21ac-46ea-979d-78086efb964c : Pirates going for 4-game sweep of Cubs
     << be849c82-41cf-4e98-ac32-9766a199e763 : (GPE America/NNP), 
     << 690c174d-a365-4b8a-8712-abd222f13902 : 
     << e75f4270-8922-4eab-b688-69e34e387c6f : (ORGANIZATION Yankees/NNS), (PERSON Rays/NNP), 
     << f829392a-3702-45bb-bff8-d35261dfa03b : (GPE Recap/NN), (ORGANIZATION SEA/NNP), 
     << ad953f96-21ac-46ea-979d-78086efb964c : (GPE Cubs/NNP), 
    
  • 相关阅读:
    Vue知识总结
    Excel使用技巧
    java框架总结
    java反射学习总结
    java虚拟机
    vue学习知识
    mysql索引知识
    前端函数定义及表格总结
    SpringMVC异常处理
    restful风格的概念
  • 原文地址:https://www.cnblogs.com/peng8098/p/nlp_8.html
Copyright © 2020-2023  润新知