Github版在这里
知识提取是要解决结构化数据生成的问题。但是广义上讲,知识提取是数据质量提升中的一环,各种提升数据质量的方法,都可以视为某种知识提取。学术上一般是用自然语言处理的方法,但在实践中通常是利用规则。
我们要熟悉的概念和工具有 (假设大家已经熟悉了Python)
正则表达式
正则表达式(Regular Expression, regex)是字符串处理的基本功。数据爬取、数据清洗、实体提取、关系提取,都离不开regex。
教程:
- Python Module of the Week上的讲Python的re包 https://pymotw.com/2/re/
- Ubuntu Wiki上的 Python正则表达式操作指南
应该掌握的知识点
- 基本regex语法
- 用match匹配模式
- 使用group和提取匹配数据
Regex工具
- regexper 可视化: 例 [a-z]*(\d{4}(\D+))
- pythex 在线测试正则表达式 http://pythex.org/
进阶阅读
- re2 一个更快的Cython实现 https://pypi.python.org/pypi/re2/
- pyahocorasick 用字典树和Aho-Corasick自动机实现的超快的正则引擎https://pypi.python.org/pypi/pyahocorasick/
- PythonVerbalExpressions 类自然语言构造正则表达式https://github.com/VerbalExpressions/PythonVerbalExpressions
- Exrex 从正则表达式生成随机字符串 https://github.com/asciimoo/exrex
- PyParsing 构造正则语法(和更多规则)和提取的引擎 http://pyparsing.wikispaces.com/
- Parsley 更人性化的正则表达语法 http://parsley.readthedocs.io/en/latest/tutorial.html
中文分词和词性标注
分词也是后续处理的基础。分词做得好,核心秘密在词库,算法的影响反而不太大。分词是会出错的。不过有些场合(比如检索排序),只要错误是一贯的,影响也不是太大。分词后面可以用规则来弥补。工程上很丑陋,上不了台面,但对早期的小项目可能够用了。
词性(Part of Speech, POS)就是中学大家学过的动词、名词、形容词等等的词的分类。一般的分词工具都会有词性标注的选项。
教程:
- 中文分词的原理与实践(royguo) http://sobuhu.com/ml/2012/12/23/chinese-word-spliter.html
- jieba 中文分词包,按说明试一遍 https://github.com/fxsjy/jieba
- PyNLPIR 提供 NLPIR/ICTCLAS汉语分词的Python接口,看这个教程http://pynlpir.readthedocs.io/en/latest/tutorial.html
- 中文词性标记集 https://github.com/memect/kg-beijing/wiki/中文词性标记集
应该掌握的知识点
- 用jieba分词和提取词性
- 使用自定义词典
- 熟悉中文词性标记是什么(如n nr v)
扩展阅读:
- 漫话中文自动分词和语义识别 http://www.matrix67.com/blog/archives/4212http://www.matrix67.com/blog/archives/4870
- genius 采用 CRF条件随机场算法 https://github.com/duanhongyi/genius
- yaha “哑哈”中文分词 https://github.com/jannson/yaha
- Pattern 用词性标签扩展的正则表达式,很神奇的 http://www.clips.ua.ac.be/pattern
- NLTK提供了Stanford POS tagger的接口 http://www.nltk.org/api/nltk.tag.html#module-nltk.tag.stanford
- 梁斌的pullword 在线分词API http://www.pullword.com/
命名实体识别
用nltk调用Stanford NLP包
- 下载Stanford NLP包:
http://stanfordnlp.github.io/CoreNLP/index.html#download (CORE, 基本上包含所有的tool,里面有MODELS下载地址)
http://nlp.stanford.edu/software/tagger.html (POS tagger)
http://nlp.stanford.edu/software/CRF-NER.html (NER)
- 下载Stanford NLP pre-trained models:
Stanford 中文NER Model: http://nlp.stanford.edu/software/stanford-chinese-corenlp-2015-12-08-models.jar
Other NER Models: http://nlp.stanford.edu/software/CRF-NER.html
POS Models: http://nlp.stanford.edu/software/stanford-postagger-full-2015-12-09.zip (包含中文)
- 代码示例:
import os
from from nltk.tag import StanfordNERTagger
def main():
st = StanfordNERTagger('english.all.3class.distsim.crf.ser.gz')
print st.tag('George Washington is the president of the United States.'.split())
if __name__ == "__main__":
os.environ["CLASSPATH"] = "~/Library/stanford-ner-2015-12-09"
os.environ["STANFORD_MODELS"] = "~/Library/stanford-ner-2015-12-09/models"
main()
可以更改tagger和models 比如NER,中文models
记得设置CLASSPATH和STANFORD_MODELS
- Other Tutorials and references:
RPI季恒教授关于name tagger: http://nlp.cs.rpi.edu/course/spring14/lecture6.pdf
NLTK-Stanford taggers: http://www.nltk.org/api/nltk.tag.html#module-nltk.tag.stanford
Stanford NER PPT: http://nlp.stanford.edu/software/jenny-ner-2007.ppt
作业
综合分词工具和正则表达式提取邮件签名档
下面有几个来自真实邮件的签名档,请尽可能提取下面的关键字段
- 姓名
- 单位
- 电话号码
- 电子邮件
如何提交作业:fork kg-beijing 仓库,在class1/week1/homework目录下建一个自己id的子目录,把自己的代码、运行结果放在里面,提交pull request
刘三 Liu, San
+86 15912348765
sfghsdfg@abc.org.cn
--------------------------
李四
北清大数据产业联合会
电话:010-34355675
邮箱:lisi@beiqingdata.com
地址:北京市海淀区北清大学东楼201室
--------------------------
John Smith
Data and Web Science Group
University of Mannheim, Germany
http://dws.informatik.uni-mannheim.de/~johnsmith
Tel: +49 621 123 4567
--------------------------
王五
CSDN-全球最大中文IT技术社区(www.csdn.net)
电话:010-51661202-257
手机:13934567890
E-mail:gdagsdfs@csdn.net
QQ、微信:34534563
地址:北京市朝阳区广顺北大街33号院一号楼福码大厦B座12层
--------------------------
张三
北京市张三律师事务所|Beijing Zhangsan Law Firm
北京市海淀区中关村有条街1号,邮编:100080
No. 1 Youtiao Street , ZhongGuanCun West, Haidian District, Beijing 100080
Mobile: 15023345465|Email: dfgasedt@126.com
(一个更大的不公开的测试集将通过邮件分享给大家)
发表回复