NLP(五) 词性标注和文法
原文链接:http://www.one2know.cn/nlp5/
- NLTK内置词性标注器
用nltk.pos_tag()函数进行词性标注
import nltk
nltk.download('averaged_perceptron_tagger')
simpleSentence = 'Bangalore is the capital of Karnataka.'
# 分词
wordsInSentence = nltk.word_tokenize(simpleSentence)
print(wordsInSentence)
# 词性标注
partsOfSpeechTags = nltk.pos_tag(wordsInSentence)
print(partsOfSpeechTags)
输出:
['Bangalore', 'is', 'the', 'capital', 'of', 'Karnataka', '.']
[('Bangalore', 'NNP'), ('is', 'VBZ'), ('the', 'DT'), ('capital', 'NN'), ('of', 'IN'), ('Karnataka', 'NNP'), ('.', '.')]
- 自己的词性标注器
import nltk
# 默认:不认识的都标成NN
def learnDefaultTagger(simpleSentence):
wordsInSentence = nltk.word_tokenize(simpleSentence)
tagger = nltk.DefaultTagger('NN')
posEnabledTags = tagger.tag(wordsInSentence)
print(posEnabledTags)
# 正则表达式标注
def learnRETagger(simpleSentence):
# 元组列表,r不能省哦
customPatterns =[
(r'.*ing$','ADJECTIVE'),
(r'.*ly$','ADVERB'),
(r'.*ion$','NOUN'),
(r'(.*ate|.*en|is)$','VERB'),
(r'^an$','INDEFINITE-ARTICLE'),
(r'^(with|on|at)$','PREPOSITION'),
(r'^[0-9]*$','NUMBER'),
(r'.*$',None),
]
tagger = nltk.RegexpTagger(customPatterns)
wordsInSentencs = nltk.word_tokenize(simpleSentence)
posEnabledTags =tagger.tag(wordsInSentencs)
print(posEnabledTags)
# 字典标注
def learnLookupTagger(simpleSentence):
mapping = {
'.':'.','place':'NN','on':'IN','earth':'NN','Mysore':'NNP',
'is':'VBZ','an':'DT','amazing':'JJ',
}
tagger = nltk.UnigramTagger(model=mapping)
wordsInSentencs = nltk.word_tokenize(simpleSentence)
posEnabledTags = tagger.tag(wordsInSentencs)
print(posEnabledTags)
if __name__ == "__main__":
testSentence = 'Mysore is an amazing place on earth. I have visited Mysore 10 times.'
learnDefaultTagger(testSentence)
learnRETagger(testSentence)
learnLookupTagger(testSentence)
输出:
[('Mysore', 'NN'), ('is', 'NN'), ('an', 'NN'), ('amazing', 'NN'), ('place', 'NN'), ('on', 'NN'), ('earth', 'NN'), ('.', 'NN'), ('I', 'NN'), ('have', 'NN'), ('visited', 'NN'), ('Mysore', 'NN'), ('10', 'NN'), ('times', 'NN'), ('.', 'NN')]
[('Mysore', None), ('is', 'VERB'), ('an', 'INDEFINITE-ARTICLE'), ('amazing', 'ADJECTIVE'), ('place', None), ('on', 'PREPOSITION'), ('earth', None), ('.', None), ('I', None), ('have', None), ('visited', None), ('Mysore', None), ('10', 'NUMBER'), ('times', None), ('.', None)]
[('Mysore', 'NNP'), ('is', 'VBZ'), ('an', 'DT'), ('amazing', 'JJ'), ('place', 'NN'), ('on', 'IN'), ('earth', 'NN'), ('.', '.'), ('I', None), ('have', None), ('visited', None), ('Mysore', 'NNP'), ('10', None), ('times', None), ('.', '.')]
- 训练自己的词性标注器
import nltk
import pickle
# 训练集
def sampleData():
return [
'Bangalore is the capital of Karnataka.',
'Steve Jobs was the CEO of Apple.',
'iPhone was Invented by Apple.',
'Books can be purchased in Market.',
]
# 逐句分词,得到词性,将训练集的词和词性放到字典里
def buildDictionary():
dictionary = {}
for sent in sampleData():
partsOfSpeechTags = nltk.pos_tag(nltk.word_tokenize(sent))
for tag in partsOfSpeechTags:
value = tag[0]
pos = tag[1]
dictionary[value] = pos
return dictionary
def saveMyTagger(tagger,fileName):
fileHandle = open(fileName,'wb')
pickle.dump(tagger,fileHandle) # 写入二进制
fileHandle.close()
# 用学习的字典得到tagger
def saveMyTraining(fileName):
tagger = nltk.UnigramTagger(model=buildDictionary())
saveMyTagger(tagger,fileName)
# 读取自己的模型
def loadMyTagger(fileName):
return pickle.load(open(fileName,'rb'))
sentence = 'IPhone is purchased by Steve Jobs in Bangalore Market.'
fileName = 'myTagger.pickle'
saveMyTraining(fileName)
myTagger = loadMyTagger(fileName)
print(myTagger.tag(nltk.word_tokenize(sentence)))
输出:
[('IPhone', None), ('is', 'VBZ'), ('purchased', 'VBN'), ('by', 'IN'), ('Steve', 'NNP'), ('Jobs', 'NNP'), ('in', 'IN'), ('Bangalore', 'NNP'), ('Market', 'NNP'), ('.', '.')]
- 编写自己的文法
上下文无关文法:
1.开始符号/标记
2.终结符号集合
3.非终结符号集合
4.定义开始符号和规则(产生式)
5.语言是英文时,a-z是符号/标记/字母
6.语言是数字时,0-9是符号/标记/字母
产生式是用巴克斯-诺尔(BNF)范式写的
import nltk
import string
from nltk.parse.generate import generate
import sys
# 定义一个起始符号为ROOT的文法
productions = [
'ROOT -> WORD',
'WORD -> \' \'',
'WORD -> NUMBER LETTER',
'WORD -> LETTER NUMBER',
]
# 添加新的生成方式 'NUMBER -> 0|1|2|3'
digits = list(string.digits) # str格式的数字
for digit in digits[:4]:
productions.append('NUMBER -> \'{w}\''.format(w=digit))
# 添加新的生成方式 'LETTER -> a|b|c|d'
letters ="' | '".join(list(string.ascii_lowercase)[:4])
productions.append('LETTER -> \'{w}\''.format(w=letters))
# 将文法分行存于grammarString
grammarString = '\n'.join(productions)
# 创建文法对象,并查看之
grammar = nltk.CFG.fromstring(grammarString)
print(grammar)
# 读取语法树 最多个数:5 最多层数:4
for sentence in generate(grammar,n=5,depth=4):
palindrome = ''.join(sentence).replace(' ','')
print('Generated Word: {} , Size : {}'.format(palindrome,len(palindrome)))
- 输出
Grammar with 12 productions (start state = ROOT)
ROOT -> WORD
WORD -> ' '
WORD -> NUMBER LETTER
WORD -> LETTER NUMBER
NUMBER -> '0'
NUMBER -> '1'
NUMBER -> '2'
NUMBER -> '3'
LETTER -> 'a'
LETTER -> 'b'
LETTER -> 'c'
LETTER -> 'd'
Generated Word: , Size : 0
Generated Word: 0a , Size : 2
Generated Word: 0b , Size : 2
Generated Word: 0c , Size : 2
Generated Word: 0d , Size : 2
- 基于概率的上下文无关文法
所有非终结符号(左侧)的概率之和等于1
描述 | 内容 |
---|---|
开始符号 | ROOT |
非终结符号 | WORD,P1,P2,P3,P4 |
终结符号 | 'A','B','C','D','E','F','G','H' |
import nltk
from nltk.parse.generate import generate
productions = [
"ROOT -> WORD [1.0]",
"WORD -> P1 [0.25]",
"WORD -> P1 P2 [0.25]",
"WORD -> P1 P2 P3 [0.25]",
"WORD -> P1 P2 P3 P4 [0.25]",
"P1 -> 'A' [1.0]",
"P2 -> 'B' [0.5]",
"P2 -> 'C' [0.5]",
"P3 -> 'D' [0.3]",
"P3 -> 'E' [0.3]",
"P3 -> 'F' [0.4]",
"P4 -> 'G' [0.9]",
"P4 -> 'H' [0.1]",
]
grammarString = '\n'.join(productions)
# 创建grammar对象
grammar = nltk.PCFG.fromstring(grammarString)
print(grammar)
for sentence in generate(grammar,n=5,depth=4):
palindrome = ''.join(sentence).replace(' ','')
print('String : {} , Size : {}'.format(palindrome,len(palindrome)))
输出:
Grammar with 13 productions (start state = ROOT)
ROOT -> WORD [1.0]
WORD -> P1 [0.25]
WORD -> P1 P2 [0.25]
WORD -> P1 P2 P3 [0.25]
WORD -> P1 P2 P3 P4 [0.25]
P1 -> 'A' [1.0]
P2 -> 'B' [0.5]
P2 -> 'C' [0.5]
P3 -> 'D' [0.3]
P3 -> 'E' [0.3]
P3 -> 'F' [0.4]
P4 -> 'G' [0.9]
P4 -> 'H' [0.1]
String : A , Size : 1
String : AB , Size : 2
String : AC , Size : 2
String : ABD , Size : 3
String : ABE , Size : 3
- 编写递归的上下文无关文法
以递归方法生成回文为例,回文:比如01语言系统的 010010 等
# 生成偶数回文数字
import nltk
import string
from nltk.parse.generate import generate
productions = [
'ROOT -> WORD',
"WORD -> ' '",
]
alphabets = list(string.digits)
for alphabet in alphabets:
productions.append("WORD -> '{w}' WORD '{w}'".format(w=alphabet))
grammarString = '\n'.join(productions)
grammar = nltk.CFG.fromstring(grammarString)
print(grammar)
for sentence in generate(grammar,n=5,depth=5):
palindrome = ''.join(sentence).replace(' ','')
print('Palindrome : {} , Size : {}'.format(palindrome,len(palindrome)))
输出:
Grammar with 12 productions (start state = ROOT)
ROOT -> WORD
WORD -> ' '
WORD -> '0' WORD '0'
WORD -> '1' WORD '1'
WORD -> '2' WORD '2'
WORD -> '3' WORD '3'
WORD -> '4' WORD '4'
WORD -> '5' WORD '5'
WORD -> '6' WORD '6'
WORD -> '7' WORD '7'
WORD -> '8' WORD '8'
WORD -> '9' WORD '9'
Palindrome : , Size : 0
Palindrome : 00 , Size : 2
Palindrome : 0000 , Size : 4
Palindrome : 0110 , Size : 4
Palindrome : 0220 , Size : 4
NLP(五) 词性标注和文法的更多相关文章
- HanLP使用教程——NLP初体验
话接上篇NLP的学习坑 自然语言处理(NLP)--简介 ,使用HanLP进行分词标注处词性. HanLP使用简介 HanLP是一系列模型与算法组成的NLP工具包,目标是普及自然语言处理在生产环境中的应 ...
- 会话机器人Chatbot的相关资料
Chatbot简介 竹间智能简仁贤:打破千篇一律的聊天机器人 | Chatbot的潮流 重点关注其中关于情感会话机器人的介绍 当你对我不满的时候我应该怎么应对,当你无聊,跟我说你很烦的时候,我应该怎么 ...
- NLP+句法结构(三)︱中文句法结构(CIPS2016、依存句法、文法)
摘录自:CIPS2016 中文信息处理报告<第一章 词法和句法分析研究进展.现状及趋势>P8 -P11 CIPS2016> 中文信息处理报告下载链接:http://cips-uplo ...
- NLP+语篇分析(五)︱中文语篇分析研究现状(CIPS2016)
摘录自:CIPS2016 中文信息处理报告<第三章 语篇分析研究进展.现状及趋势>P21 CIPS2016 中文信息处理报告下载链接:http://cips-upload.bj.bcebo ...
- 【NLP】条件随机场知识扩展延伸(五)
条件随机场知识扩展延伸 作者:白宁超 2016年8月3日19:47:55 [摘要]:条件随机场用于序列标注,数据分割等自然语言处理中,表现出很好的效果.在中文分词.中文人名识别和歧义消解等任务中都有应 ...
- 转:NLP+句法结构(三)︱中文句法结构(CIPS2016、依存句法、文法)
NLP+句法结构(三)︱中文句法结构(CIPS2016.依存句法.文法)转自:https://www.cnblogs.com/maohai/p/6453389.html 摘录自:CIPS2016 中文 ...
- nlp词性标注
nlp词性标注 与分词函数不同,jieba库和pyltp库词性标注函数上形式相差极大. jieba的词性标注函数与分词函数相近,jieba.posseg.cut(sentence,HMM=True)函 ...
- NLP自然语言处理 jieba中文分词,关键词提取,词性标注,并行分词,起止位置,文本挖掘,NLP WordEmbedding的概念和实现
1. NLP 走近自然语言处理 概念 Natural Language Processing/Understanding,自然语言处理/理解 日常对话.办公写作.上网浏览 希望机器能像人一样去理解,以 ...
- NLP(十五)让模型来告诉你文本中的时间
背景介绍 在文章NLP入门(十一)从文本中提取时间 中,笔者演示了如何利用分词.词性标注的方法从文本中获取时间.当时的想法比较简单快捷,只是利用了词性标注这个功能而已,因此,在某些地方,时间的识别 ...
随机推荐
- bootstrap开发响应式网页的常用的一些 类的说明
1.navbar-导航条 1.navbar-fixed-top,让导航条固定显示在页面上部(注意:固定的导航条会遮住代码,解决方案,给body设置padding-top的值[大于或等于]为我们导航条的 ...
- TIJ学习--RTTI(Runtime-Time Type Identification)
TIJ学习--RTTI(Runtime-Time Type Identification) RTTI 运行时类型检查机制 获取一个类的Class引用的三种方法 class TestClass{} Te ...
- Docker Toolbox安装
公司最近搭建docker环境,其中会遇到一些问题,在这里记录一下. 先来了解一下docker 一.基本概念 1.Docker中基本概念镜像(Image) 提到镜像,有对操作系统有一定认知的都知道,镜像 ...
- Mysql之锁、事务绝版详解---干货!
一 锁的分类及特性 数据库锁定机制简单来说,就是数据库为了保证数据的一致性,而使各种共享资源在被并发访问变得有序所设计的一种规则.对于任何一种数据库来说都需要有相应的锁定机制,所以MySQL自然也不能 ...
- export,export default,module.exports,import,require之间的区别和关联
module.exports Node 应用由模块组成,采用 CommonJS 模块规范.根据这个规范,每个文件就是一个模块,有自己的作用域.在这些文件里面定义的变量.函数.类,都是私有的,对外不可见 ...
- DesignPattern系列__03依赖倒置原则
依赖倒置原则(Dependence Inversion Priiciple,DIP) 介绍 High level modules should not depend upon low level mo ...
- ORACLE 的CONNECT BY、START WITH,CONNECT_BY_ROOT、CONNECT_BY_ISLEAF、SYS_CONNECT_BY_PATH,LEVEL的使用(Hierarchical query-层次查询)
如果表中存在层次数据,则可以使用层次化查询子句查询出表中行记录之间的层次关系基本语法: START WITH <condition1> CONNECT BY [ NOCYCLE ] < ...
- centos yum 安装 mariadb
1. 在 /etc/yum.repos.d/ 下建立 MariaDB.repo,输入内容 [mariadb] name=MariaDB baseurl=http://yum.mariadb.org/1 ...
- 干货 |《从Lucene到Elasticsearch全文检索实战》拆解实践
1.题记 2018年3月初,萌生了一个想法:对Elasticsearch相关的技术书籍做拆解阅读,该想法源自非计算机领域红火已久的[樊登读书会].得到的每天听本书.XX拆书帮等. 目前市面上Elast ...
- DedeCMS V5.7 SP2前台文件上传漏洞(CVE-2018-20129)
DedeCMS V5.7 SP2前台文件上传漏洞(CVE-2018-20129) 一.漏洞描述 织梦内容管理系统(Dedecms)是一款PHP开源网站管理系统.Dedecms V5.7 SP2版本中的 ...