📜  自然语言处理 |正则表达式和词缀标记

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

自然语言处理 |正则表达式和词缀标记

正则表达式匹配用于标记单词。考虑这个例子,数字可以与 \d 匹配以分配标签 CD(它指的是一个基数)。或者可以匹配已知的单词模式,例如后缀“ing”。

理解这个概念——

  • RegexpTagger 是 SequentialBackoffTagger 的子类。它可以放置在 DefaultTagger 类之前,以便标记 n-gram 标注器遗漏的单词,因此可以成为退避链的有用部分。
  • 在初始化时,模式保存在 RegexpTagger 类中。然后调用choose_tag(),它遍历模式。然后,它返回第一个可以使用 re.match() 匹配当前单词的表达式标签。
  • 因此,如果两个给定的表达式匹配,则将返回第一个的标记,甚至无需尝试第二个表达式。
  • 如果给定的模式类似于 – (r'.*', 'NN'),RegexpTagger 类可以替换 DefaultTagger 类

代码 #1: Python正则表达式模块和 re 语法

Python3
patterns = [(r'^\d+$', 'CD'),
            # gerunds, i.e. wondering
            (r'.*ing$', 'VBG'),
            # i.e. wonderment
            (r'.*ment$', 'NN'),
            # i.e. wonderful
            (r'.*ful$', 'JJ')]


Python3
# Loading Libraries
from tag_util import patterns
from nltk.tag import RegexpTagger
from nltk.corpus import treebank
 
test_data = treebank.tagged_sents()[3000:]
 
tagger = RegexpTagger(patterns)
print ("Accuracy : ", tagger.evaluate(test_data))


Python3
# loading libraries
from tag_util import word_tag_model
from nltk.corpus import treebank
from nltk.tag import AffixTagger
 
# initializing training and testing set   
train_data = treebank.tagged_sents()[:3000]
test_data = treebank.tagged_sents()[3000:]
 
print ("Train data : \n", train_data[1])
 
# Initializing tagger
tag = AffixTagger(train_data)
 
# Testing
print ("\nAccuracy : ", tag.evaluate(test_data))


Python3
# Specifying 3 character prefixes
prefix_tag = AffixTagger(train_data,
                         affix_length = 3)
 
# Testing
accuracy = prefix_tag.evaluate(test_data)
 
print ("Accuracy : ", accuracy)


Python3
# Specifying 2 character suffixes
sufix_tag = AffixTagger(train_data,
                         affix_length = -2)
 
# Testing
accuracy = sufix_tag.evaluate(test_data)
 
print ("Accuracy : ", accuracy)


RegexpTagger类需要两个元组的列表

-> first element in the tuple is a regular expression
-> second element is the tag

代码 #2:使用 RegexpTagger

Python3

# Loading Libraries
from tag_util import patterns
from nltk.tag import RegexpTagger
from nltk.corpus import treebank
 
test_data = treebank.tagged_sents()[3000:]
 
tagger = RegexpTagger(patterns)
print ("Accuracy : ", tagger.evaluate(test_data))

输出 :

Accuracy : 0.037470321605870924

什么是词缀标记?
它是 ContextTagger 的子类。对于 AffixTagger 类,上下文是单词的后缀或前缀。因此,它清楚地表明该类可以基于单词开头或结尾的固定长度子字符串来学习标签。
它指定三个字符的后缀。该词的长度必须至少为 5 个字符,如果一个词少于 5 个字符,则返回 None 作为标签。

代码 #3:了解 AffixTagger。

Python3

# loading libraries
from tag_util import word_tag_model
from nltk.corpus import treebank
from nltk.tag import AffixTagger
 
# initializing training and testing set   
train_data = treebank.tagged_sents()[:3000]
test_data = treebank.tagged_sents()[3000:]
 
print ("Train data : \n", train_data[1])
 
# Initializing tagger
tag = AffixTagger(train_data)
 
# Testing
print ("\nAccuracy : ", tag.evaluate(test_data))

输出 :

Train data :  
[('Mr.', 'NNP'), ('Vinken', 'NNP'), ('is', 'VBZ'), ('chairman', 'NN'), 
('of', 'IN'), ('Elsevier', 'NNP'), ('N.V.', 'NNP'), (', ', ', '), ('the', 'DT'),
('Dutch', 'NNP'), ('publishing', 'VBG'), ('group', 'NN'), ('.', '.')]

Accuracy : 0.27558817181092166

代码#4:通过指定 3 个字符前缀来附加标签。

Python3

# Specifying 3 character prefixes
prefix_tag = AffixTagger(train_data,
                         affix_length = 3)
 
# Testing
accuracy = prefix_tag.evaluate(test_data)
 
print ("Accuracy : ", accuracy)

输出 :

Accuracy : 0.23587308439456076

代码 #5 :通过指定 2 个字符后缀的 AffixTagger

Python3

# Specifying 2 character suffixes
sufix_tag = AffixTagger(train_data,
                         affix_length = -2)
 
# Testing
accuracy = sufix_tag.evaluate(test_data)
 
print ("Accuracy : ", accuracy)

输出 :

Accuracy : 0.31940427368875457