当前位置:   article > 正文

自然语言处理(1)——词汇标注_根据指定的词语标注

根据指定的词语标注

如何进行词汇标注呢?首先进行数据预处理,例如如果给定的是句子,先要对句子进行分割;最简单的标注器,可以给定词汇使用得最频繁的词性作为标注器中该词汇的词性,但是由于词汇存在二义性,使得这种标注准确度受限,通过上下文语境,可以在一定程度上解决这个问题,可以采用N-gram标注器,此外,Brill标注器具有修正功能。

为了使python的中文注释正确,必须在开头加上一句代码

  1. # -*- coding: utf-8 -*-
  2. # 这个编码转换必须放在第一行,否则中文注释会报错

将词汇按它们的词性(parts-of-speech,POS)分类以及相应的标注它们的过程被称为词性标注(part-of-speech tagging, POS tagging)。

利用NLTP,可以比较方便地进行词性标注。

为了对词汇进行标注,我们需要把句子进行分割,之后可以使用nltk的词性标注器进行标注。

  1. # 使用词性标注器
  2. text=nltk.word_tokenize("And now for something completely different")
  3. nltk.pos_tag(text)

NLTK中对数据进行预处理

  1. # str2tuple()从表示一个已标注的标识符的标准字符串创建一个这样的特殊元组
  2. tagged_token=nltk.tag.str2tuple('fly/NN')
  3. # text.similar()方法为一个词w 找出所有上下文w1ww2,然后找出所有出现在相同上下文中的词w',即w1w'w2
  4. text=nltk.Text(word.lower() for word in nltk.corpus.brown.words())
  5. text.similar('woman')
  6. # 读取已标注语料库
  7. # 常用语料库 brown, nps_chat, conll2000, treebank,
  8. nltk.corpus.brown.tagged_words()
  9. from nltk.corpus import brown
  10. brown_news_tagged=brown.tagged_words(categories='news')
  11. tag_fd=nltk.FreqDist(tag for (word, tag) in brown_news_tagged)
  12. tag_fd.keys()[:5]
  13. # 找出最频繁的名词标记
  14. def findtags(tag_prefix, tagged_text):
  15. cfd=nltk.ConditionalFreqDist((tag,word) for (word,tag) in tagged_text
  16. if tag.startswith(tag_prefix))
  17. return dict((tag, cfd[tag].keys()[:5]) for tag in cfd.conditions())
  18. # 查看跟在ofen后的词汇
  19. brown_learned_text=nltk.corpus.brown.words(categories='learned')
  20. sorted(set(b for(a,b) in nltk.bigrams(brown_learned_text) if a=='often'))
  21. # 使用POS标记寻找三词短语
  22. from nltk.corpus import brown
  23. def process(sentence):
  24. for (w1,t1),(w2,t2),(w3,t3) in nltk.trigrams(sentence):
  25. if (t1.startswith('V') and t2=='TO' and t3.startswith('V')):
  26. print w1,w2,w3
  27. # 查看标记模糊的词
  28. brown_news_tagged = brown.tagged_words(categories='news')
  29. data=nltk.ConditionalFreqDist((word.lower(),tag) for (word,tag) in brown_news_tagged)
  30. for word in data.conditions():
  31. if len(data[word])>=3:
  32. tags=data[word].keys()
  33. print word,' '.join(tags)
  34. '''
  35. 使用Python字典映射词及其属性 pos['键']='值',字典不是序列,键没有固定顺序,
  36. 定义字典:pos={'A':'a','B':'b'}或pos=dict(A='a',B='b')
  37. 使用for循环遍历字典中的键:for word in sorte(dict)
  38. 字典的常用方法。keys(), values(), items(): for key,val in sorted(dict.items()),update(), append()
  39. 字典的键必须是不可改变的类型,如字符串或元组
  40. '''
  41. # 递增的更新字典
  42. counts=nltk.defaultdict(int)
  43. from nltk.corpus import brown
  44. for (word,tag) in brown.tagged_words(categories='news'):
  45. counts[tag]+=1
  46. from operator import itemgetter
  47. sorted(counts.items(), key=itemgetter(1),reverse=True) #按照值递减排序
  48. # 如果经常用到反向查找,可以建立一个值到键的字典

标注器   二义性限制了标注器的上限,上下文可以解决歧义问题
N-gram标注 利用了上下文中的词作为特征,有点像开环的,没有反馈
Brill标注 归纳标注法 猜测每个词的标注,然后返回和修复错误,有点像闭环,有返回,不对修正错误

  1. # NLTK数据加载
  2. from nltk.corpus. import brown
  3. brown_tagged_sents=brown.tagged_sents(categories='news') #加载已标注句子
  4. brown_sents=brown.sents(categories='news') #加载句子
  5. # 正则表达式标注器
  6. patterns=[
  7. (r'.*ing$','VBG'),
  8. (r'.*ed&','VBD'),
  9. (r'.*es$','VBZ'),
  10. (r'.*ould$', 'MD'),
  11. (r'.*\'s$', 'NN$'),
  12. (r'.*s$', 'NNS'),
  13. (r'^-?[0-9]+(.[0-9]+)?$', 'CD'),
  14. (r'.*', 'NN')
  15. ]
  16. regexp_tagger=nltk.RegexpTagger(patterns)
  17. regexp_tagger.tag(brown_sents[3])
  18. #查询标注器
  19. fd = nltk.FreqDist(brown.words(categories='news')) #词汇的频率统计
  20. cfd = nltk.ConditionalFreqDist(brown.tagged_words(categories='news')) #词汇的条件分布,该词的词性的统计
  21. most_freq_words = fd.keys()[:100] #前100个高频词
  22. likely_tags = dict((word, cfd[word].max()) for word in most_freq_words) #前100个高频词,以及高频词的最可能的词性标注
  23. baseline_tagger = nltk.UnigramTagger(model=likely_tags)
  24. # 回退
  25. baseline_tagger = nltk.UnigramTagger(model=likely_tags, backoff=nltk.DefaultTagger('NN'))
  26. # N-gram标注
  27. from nltk.corpus import brown
  28. brown_tagged_sents = brown.tagged_sents(categories='news')
  29. brown_sents = brown.sents(categories='news')
  30. unigram_tagger = nltk.UnigramTagger(brown_tagged_sents) # 通过已经标注的句子训练一个一元标注器
  31. unigram_tagger.tag(brown_sents[2007]) # 使用这个一元标注器标注未进行标注的句子
  32. bigram_tagger.evaluate(test_sents) # 用于评估
  33. # 组合标注器:解决精度和覆盖范围的一个权衡办法
  34. t0=nltk.DefaultTagger('NN')
  35. t1=nltk.UnigramTagger(train_sents,backoff=t0)
  36. t2=nltk.BigramTagger(train_sents,backoff=t1)
  37. t2.evaluate(test_sents) # 先调用t2的bigram标注器标注,找不到就尝试t1,再不行就用默认标注器t0
  38. nltk.BigramTagger(sents,cutoff=2,backoff=t1) # 丢弃只出现一两次的上下文
  39. # 存储标注器给以后使用
  40. from cPickle import dump
  41. output=open('t2.pkl','wb')
  42. dump(t2,output,-1) #将t2标注器写到output,可以用方法的形式 p=cPickle.dump(t2)
  43. output.close()
  44. from cPickle import load
  45. input=open('t2.pkl','rb')
  46. tagger=load(input)
  47. # brill标注器演示 基于转换的标注学习一系列“改变标记s 为标记t 在上下文c 中”形式的修复规则
  48. nltk.tag.brill.demo()

一直以来都没有写博客的习惯,从今天开始,要改变自己。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/588740
推荐阅读
相关标签
  

闽ICP备14008679号