原文链接: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(五) 词性标注和文法的更多相关文章

  1. HanLP使用教程——NLP初体验

    话接上篇NLP的学习坑 自然语言处理(NLP)--简介 ,使用HanLP进行分词标注处词性. HanLP使用简介 HanLP是一系列模型与算法组成的NLP工具包,目标是普及自然语言处理在生产环境中的应 ...

  2. 会话机器人Chatbot的相关资料

    Chatbot简介 竹间智能简仁贤:打破千篇一律的聊天机器人 | Chatbot的潮流 重点关注其中关于情感会话机器人的介绍 当你对我不满的时候我应该怎么应对,当你无聊,跟我说你很烦的时候,我应该怎么 ...

  3. NLP+句法结构(三)︱中文句法结构(CIPS2016、依存句法、文法)

    摘录自:CIPS2016 中文信息处理报告<第一章 词法和句法分析研究进展.现状及趋势>P8 -P11 CIPS2016> 中文信息处理报告下载链接:http://cips-uplo ...

  4. NLP+语篇分析(五)︱中文语篇分析研究现状(CIPS2016)

    摘录自:CIPS2016 中文信息处理报告<第三章 语篇分析研究进展.现状及趋势>P21 CIPS2016 中文信息处理报告下载链接:http://cips-upload.bj.bcebo ...

  5. 【NLP】条件随机场知识扩展延伸(五)

    条件随机场知识扩展延伸 作者:白宁超 2016年8月3日19:47:55 [摘要]:条件随机场用于序列标注,数据分割等自然语言处理中,表现出很好的效果.在中文分词.中文人名识别和歧义消解等任务中都有应 ...

  6. 转:NLP+句法结构(三)︱中文句法结构(CIPS2016、依存句法、文法)

    NLP+句法结构(三)︱中文句法结构(CIPS2016.依存句法.文法)转自:https://www.cnblogs.com/maohai/p/6453389.html 摘录自:CIPS2016 中文 ...

  7. nlp词性标注

    nlp词性标注 与分词函数不同,jieba库和pyltp库词性标注函数上形式相差极大. jieba的词性标注函数与分词函数相近,jieba.posseg.cut(sentence,HMM=True)函 ...

  8. NLP自然语言处理 jieba中文分词,关键词提取,词性标注,并行分词,起止位置,文本挖掘,NLP WordEmbedding的概念和实现

    1. NLP 走近自然语言处理 概念 Natural Language Processing/Understanding,自然语言处理/理解 日常对话.办公写作.上网浏览 希望机器能像人一样去理解,以 ...

  9. NLP(十五)让模型来告诉你文本中的时间

    背景介绍   在文章NLP入门(十一)从文本中提取时间 中,笔者演示了如何利用分词.词性标注的方法从文本中获取时间.当时的想法比较简单快捷,只是利用了词性标注这个功能而已,因此,在某些地方,时间的识别 ...

随机推荐

  1. 洛谷 P5150 题解

    题面 因为 n=lcm(a,b)n = lcm(a, b)n=lcm(a,b) ,可以得出: a  和 b  的质因数都是 n 的质因数 对于 n  的每个质因数 x ,在 n 中的次数为 y ,那么 ...

  2. 【iOS】Your account already has a valid ios

    打包内测的时候遇到了这个问题,如图所示: 官网解决办法: If the certificate already exists in Member Center, a “Your account alr ...

  3. JavaScript数据结构——集合的实现与应用

    与数学中的集合概念类似,集合由一组无序的元素组成,且集合中的每个元素都是唯一存在的.可以回顾一下中学数学中集合的概念,我们这里所要定义的集合也具有空集(即集合的内容为空).交集.并集.差集.子集的特性 ...

  4. DesignPattern系列__06迪米特原则

    迪米特原则定义 迪米特原则,也叫最少知道原则,即一个类应该对自己依赖的类知道的越少越好,而你被依赖的类多么复杂,对我都没有关系.也就是说,对于别依赖的类来说,不管业务逻辑多么复杂,都应该尽量封装在类的 ...

  5. Redis总结(八)如何搭建高可用的Redis集群

    以前总结Redis 的一些基本的安装和使用,大家可以这这里查看Redis 系列文章:https://www.cnblogs.com/zhangweizhong/category/771056.html ...

  6. vue+Elment-UI,修改element组件样式

    在用vue开发项目过程中,我们总是避免不了的会使用到elementUI,它里面提供的一些组件都为我们的开发带来了很大的便利,但是,当有时候我们需要使用这些组件的同时又要修改下组件的UI样式的话,我们该 ...

  7. Java虚拟机学习笔记(三)--- 生存还是死亡

    即便是可达性分析中不可达的对象,也不代表该对象一定被回收,一个对象被“宣判死刑”需要经过两次标记,第一次是被可达性算法标记为不可用,然后进入第二次筛选,筛选条件是对象是否有必要执行finalize() ...

  8. 【C++】string::substr函数

    形式:s.substr(p, n) 返回一个string,包含字符串s中从p开始的n个字符的拷贝(p的默认值是0,n的默认值是s.size() - p,即不加参数会默认拷贝整个s) int main( ...

  9. 转载 | 一种让超大banner图片不拉伸、全屏宽、居中显示的方法

    现在很多网站的Banner图片都是全屏宽度的,这样的网站看起来显得很大气.这种Banner一般都是做一张很大的图片,然后在不同分辨率下都是显示图片的中间部分.实现方法如下: <html> ...

  10. Java——数据结构(链表)

    链表,可扩展长度,泛型. public class Link { Node header = null; //头结点 int length;//当前链表长度 class Node { Node nex ...