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

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

输出:

  1. >> be849c82-41cf-4e98-ac32-9766a199e763 : The Bandwagon: All-Stars, America and more
  2. >> 690c174d-a365-4b8a-8712-abd222f13902 : Cards regain power, look for series win vs. Mariners
  3. >> e75f4270-8922-4eab-b688-69e34e387c6f : Yankees look to continue success against Rays
  4. >> f829392a-3702-45bb-bff8-d35261dfa03b : Recap: STL 5, SEA 2
  5. >> ad953f96-21ac-46ea-979d-78086efb964c : Pirates going for 4-game sweep of Cubs
  6. << be849c82-41cf-4e98-ac32-9766a199e763 : (GPE America/NNP),
  7. << 690c174d-a365-4b8a-8712-abd222f13902 :
  8. << e75f4270-8922-4eab-b688-69e34e387c6f : (ORGANIZATION Yankees/NNS), (PERSON Rays/NNP),
  9. << f829392a-3702-45bb-bff8-d35261dfa03b : (GPE Recap/NN), (ORGANIZATION SEA/NNP),
  10. << ad953f96-21ac-46ea-979d-78086efb964c : (GPE Cubs/NNP),

NLP(八) 创建自然语言处理管道的更多相关文章

  1. linux内核剖析(八)进程间通信之-管道

    管道 管道是一种两个进程间进行单向通信的机制. 因为管道传递数据的单向性,管道又称为半双工管道. 管道的这一特点决定了器使用的局限性.管道是Linux支持的最初Unix IPC形式之一,具有以下特点: ...

  2. 【NLP】基于自然语言处理角度谈谈CRF(二)

    基于自然语言处理角度谈谈CRF 作者:白宁超 2016年8月2日21:25:35 [摘要]:条件随机场用于序列标注,数据分割等自然语言处理中,表现出很好的效果.在中文分词.中文人名识别和歧义消解等任务 ...

  3. socketpair创建双向通信的管道(全双工通信)

    Linux下socketpair介绍: socketpair创建了一对无名的套接字描述符(只能在AF_UNIX域中使用),描述符存储于一个二元数组,例如sv[2] .这对套接字可以进行双工通信,每一个 ...

  4. 使用 Visual Studio Team Services 和 IIS 创建持续集成管道

    若要将应用程序开发的生成.测试和部署阶段自动化,可以使用持续集成和部署 (CI/CD) 管道. 本教程介绍如何在 Azure 中使用 Visual Studio Team Services 和 Win ...

  5. NLP之中文自然语言处理工具库:SnowNLP(情感分析/分词/自动摘要)

    一 安装与介绍 1.1 概述 SnowNLP是一个python写的类库,可以方便的处理中文文本内容,是受到了TextBlob的启发而写的,由于现在大部分的自然语言处理库基本都是针对英文的,于是写了一个 ...

  6. mkfifo - 创建FIFO(命名管道)

    SYNOPSIS(总览) mkfifo [options] file... POSIX options(选项): [-m mode] GNU options(选项)(最短格式): [-m mode] ...

  7. 嵌入式Linux驱动学习之路(八)创建最小的根文件系统

    busybox 在配置busybox,在是否选择要静态链接库时,在静态下,busybox中的工具不需要动态链接库,能够直接运行.而用户自己编写的程序如果需要动态链接库,还是依然需要有. 如果是动态链接 ...

  8. Coursera Deep Learning笔记 序列模型(二)NLP & Word Embeddings(自然语言处理与词嵌入)

    参考 1. Word Representation 之前介绍用词汇表表示单词,使用one-hot 向量表示词,缺点:它使每个词孤立起来,使得算法对相关词的泛化能力不强. 从上图可以看出相似的单词分布距 ...

  9. 【说解】在shell中通过mkfifo创建命名管道来控制多个进程并发执行

    背景: 工作中有两个异地机房需要传数据,数据全名很规范,在某个目录下命名为统一的前缀加上编号.如/path/from/file.{1..100}.而机房间的专线对单个scp进程的传输速度是有限制的,比 ...

随机推荐

  1. spring 注解验证@NotNull等使用方法

    @Null 被注释的元素必须为null@NotNull 被注释的元素不能为null@AssertTrue 被注释的元素必须为true@AssertFalse 被注释的元素必须为false@Min(va ...

  2. PHP7安装mysql扩展

    1.下载mysql扩展 http://git.php.net/?p=pecl/database/mysql.git;a=summary 2.解压后并使用phpize工具初始化(phpize一般在php ...

  3. Java连载10-数据类型取值范围&转义字符

    一.数据类型取值范围 二.八种数据类型在成员变量中的默认值 (1)成员变量,没有赋值,编译不会报错,系统会自动给赋值 byte\int\short\long默认值为0:float\double默认值为 ...

  4. 大数阶乘(c++实现)

    #include <iostream>using namespace std;#define N 1000int BigNumFactorial(int Num[], int n);voi ...

  5. redis分布式锁&队列应用

    分布式锁 setnx(set if not exists) 如果设值成功则证明上锁成功,然后再调用del指令释放. // 这里的冒号:就是一个普通的字符,没特别含义,它可以是任意其它字符,不要误解 & ...

  6. Java匹马行天下之J2EE框架开发——Spring—>Spring框架知多少

    ————也许我注定成不了一个伟大的人,但是至少我可以做一个很棒的自己.我想我现在应该做的不是瞻前顾后,而是活在当下,正确认知自己,做好自己现在的工作,努力提升自己的能力,踏踏实实地做一个程序员 一.思 ...

  7. SonarQube+Jenkins安装工程中遇到的吭

    1. SonarQube是不是有点飘了,居然要java11+才能运行 解决方案: 重新下载老版本 也不知道哪个版本才好用,就下载了7.0 和6.6,这两个版本用jdk1.8就可以用 2. 配置数据库u ...

  8. 案例实战:每日上亿请求量的电商系统,JVM年轻代垃圾回收参数如何优化?

    出自:http://1t.click/7TJ 目录: 案例背景引入 特殊的电商大促场景 抗住大促的瞬时压力需要几台机器? 大促高峰期订单系统的内存使用模型估算 内存到底该如何分配? 新生代垃圾回收优化 ...

  9. 每天用SpringBoot,还不懂RESTful API返回统一数据格式是怎么实现的?

    上一篇文章RESTful API 返回统一JSON数据格式 说明了 RESTful API 统一返回数据格式问题,这是请求一切正常的情形,这篇文章将说明如何统一处理异常,以及其背后的实现原理,老套路, ...

  10. 观书有感(摘自12期CSDN)

    CSDN要闻 Visual Studio 将登陆Mac平台 在11月的Connect()上,微软正式发布了Visual Studio For Max预览版,这是微软这一编程工具首次进入苹果平台.Vis ...