📜  自然语言处理 |结合 NGram 标记器

📅  最后修改于: 2022-05-13 01:54:35.499000             🧑  作者: Mango

自然语言处理 |结合 NGram 标记器

NgramTagger 有 3 个子类

  • 一元标记器
  • BigramTagger
  • 三元标记

BigramTagger 子类使用前一个标签作为其上下文的一部分
TrigramTagger 子类使用前两个标签作为其上下文的一部分。

ngram – 它是 n 个项目的子序列。
NgramTagger 子类的想法:

  • 通过查看之前的单词和词性标签,可以猜出当前单词的词性标签。
  • 每个标注器都维护一个上下文字典(ContextTagger父类用来实现它)。
  • 该字典用于根据上下文猜测该标签。
  • 在 NgramTagger 子类的情况下,上下文是一些先前标记的单词。

代码 #1:Bigram 标记器的工作

# Loading Libraries 
from nltk.tag import DefaultTagger 
from nltk.tag import BigramTagger
  
from nltk.corpus import treebank
  
# initializing training and testing set    
train_data = treebank.tagged_sents()[:3000]
test_data = treebank.tagged_sents()[3000:]
  
# Tagging
tag1 = BigramTagger(train_data)
  
# Evaluation
tag1.evaluate(test_data)

输出 :

0.11318799913662854


代码 #2:Trigram 标注器的工作

# Loading Libraries 
from nltk.tag import DefaultTagger 
from nltk.tag import TrigramTagger
  
from nltk.corpus import treebank
  
# initializing training and testing set    
train_data = treebank.tagged_sents()[:3000]
test_data = treebank.tagged_sents()[3000:]
  
# Tagging
tag1 = TrigramTagger(train_data)
  
# Evaluation
tag1.evaluate(test_data)

输出 :

0.06876753723289446


代码#3:共同使用 Unigram、Bigram 和 Trigram 标注器。

# Loading Libraries
   
from nltk.tag import TrigramTagger
from tag_util import backoff_tagger
from nltk.corpus import treebank
  
# initializing training and testing set    
train_data = treebank.tagged_sents()[:3000]
test_data = treebank.tagged_sents()[3000:]
  
backoff = DefaultTagger('NN')
tag = backoff_tagger(train_sents, 
                     [UnigramTagger, BigramTagger, TrigramTagger], 
                     backoff = backoff)
  
tag.evaluate(test_sents)

输出 :

0.8806820634578028

这个怎么运作 ?

  • backoff_tagger函数创建每个标注器类的实例。
  • 它提供了先前的标记器和 train_sents 作为退避。
  • 标注器类的顺序很重要:在上面的代码中,第一个类是 UnigramTagger,因此,它将首先被训练并给出初始的退避标注器(DefaultTagger)。
  • 然后这个标注器成为下一个标注器类的退避标注器。
  • 返回的最终标注器将是最后一个标注器类的实例——TrigramTagger

代码#4:证明

print (tagger._taggers[-1] == backoff)
  
print ("\n", isinstance(tagger._taggers[0], TrigramTagger))
  
print ("\n", isinstance(tagger._taggers[1], BigramTagger))

输出 :

True

True

True