📌  相关文章
📜  自然语言处理 | Trigrams'n'Tags (TnT) 标记

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

自然语言处理 | Trigrams'n'Tags (TnT) 标记

TnT 标记器:它是一个统计标记器,适用于二阶马尔可夫模型。

  • 这是一个非常有效的词性标注器,可以在不同的语言和任何标签集上进行训练。
  • 对于参数生成,组件在标记的语料库上进行训练。它结合了不同的平滑和处理未知词的方法
  • 线性插值用于平滑,各自的权重由删除插值确定。

TnT 标注器的 API 与普通标注器不同。可以在创建 train() 方法后显式使用它。

代码 #1:使用 train() 方法

from nltk.tag import tnt
from nltk.corpus import treebank
  
# initializing training and testing set    
train_data = treebank.tagged_sents()[:3000]
test_data = treebank.tagged_sents()[3000:]
  
# initializing tagger
tnt_tagging = tnt.TnT()
  
# training
tnt_tagging.train(train_data)
  
# evaluating
a = tnt_tagging.evaluate(test_data)
  
print ("Accuracy of TnT Tagging : ", a)

输出 :

Accuracy of TnT Tagging : 0.8756313403842003

了解 TnT 标记器的工作原理:

  • 它保持了数量
    • 内部频率分布
    • ConditionalFreqDist,基于训练数据。
  • 频率分布 (FreqDist) 计算一元、二元和三元。
  • 这些频率用于计算每个单词的可能标签的概率。
  • TnT 标记器使用所有 ngram 模型一起选择最佳标记,而不是构建 NgramTagger 子类的退避链。
  • 根据每个可能标签的概率,它为整个句子选择最可能的模型。

代码 #2 :将未知单词的标记器用作“unk”

from nltk.tag import tnt
from nltk.corpus import treebank
from nltk.tag import DefaultTagger
  
# initializing training and testing set    
train_data = treebank.tagged_sents()[:3000]
test_data = treebank.tagged_sents()[3000:]
  
# initializing tagger
unk = DefaultTagger('NN')
tnt_tagging = tnt.TnT(unk = unk, Trained = True)
  
# training 
tnt_tagging.train(train_data)
  
# evaluating
a = tnt_tagging.evaluate(test_data)
  
print ("Accuracy of TnT Tagging : ", a)

输出 :

Accuracy of TnT Tagging : 0.892467083962875
  • unknown tagger 的 tag() 方法只用一个单词语句调用。
  • TnT 标注器可以将未知单词的标注器作为 unk 传入。
  • 如果这个标注器已经受过训练,则可以传入 Trained = True。
  • 否则,它将使用可以传递给 train() 方法的相同数据调用 unk.train(data)。

控制光束搜索:

  • 为 TnT 修改的另一个参数是N ,即它控制编号。标记器维护的可能解决方案。
  • 默认情况下 N = 1000。
  • 如果增加 N 的值,内存量会增加,而准确度没有任何具体的增加。
  • 如果减小 N 的值,内存量会减少,但会降低准确度。

代码 #3:使用 N = 100

from nltk.tag import tnt
from nltk.corpus import treebank
from nltk.tag import DefaultTagger
  
# initializing training and testing set    
train_data = treebank.tagged_sents()[:3000]
test_data = treebank.tagged_sents()[3000:]
  
# initializing tagger
tnt_tagger = tnt.TnT(N = 100)
  
# training 
tnt_tagging.train(train_data)
  
# evaluating
a = tnt_tagging.evaluate(test_data)
  
print ("Accuracy of TnT Tagging : ", a)

输出 :

Accuracy of TnT Tagging : 0.8756313403842003