在自然语言处理(NLP)领域,生成文本技术是一项预测句子中下一个词是什么的技术。这种技术的应用非常广泛,包括问答聊天机器人、句子或单词自动更正、自动补全、语法检查等,它们已经成为日常生活不可或缺的一部分。为了预测下一个词,需要尽可能多地了解句子中之前出现的词。词性标注和句法分析是NLP中非常重要的组成部分,它们帮助理解句子中词的顺序和结构。
语言句法是生成文本的基础,它为词性标注和解析树提供了基础。"句法"这个词来源于希腊语"syntaxis",意思是“排列”,指的是词如何组合在一起。因此,语言句法指的是语言的结构或排列方式。
词是如何组合在一起的呢?可以通过多种方式对这些结构或排列进行分类。一种分类方式是将它们组合成单个单位或短语,这也被称为成分。一个句子可以应用不同的语言规则,并且具有不同类型的结构。句子的不同部分基于遵循相同语法规则的不同句法部分,如名词短语、动词短语和介词短语。
一个句子的结构如下所示:
句子 = 名词短语 + 动词短语 + 介词短语
S = NP + VP + PP
根据英语语法规则,存在的不同词组有:
可以创建不同形式和结构的名词短语、动词短语和介词短语,并将它们组合成一个句子。例如,让看一个句子:
"The boy ate the pancakes."
这个句子具有以下结构:
这个句子在结构和上下文上都是正确的。
然而,现在来看另一个句子:
"The boy ate the pancakes under the door."
这个句子在句法上是正确的,但在上下文上是不正确的。
以另一种方式看同一个句子:
"The boy ate the pancakes from the jumping table."
这个句子在句法上是不正确的,因为介词“from”后面跟了一个动词短语“jumping table”。
文本句法有两个重要的属性:词性标注和依存语法。词性标注或POS标注指定了词或标记的属性。句子中的每个词都与一个词性标记相关联,如名词、动词、形容词、副词。POS标记定义了词在句子中的使用和功能。
为什么在存在POS标注的情况下还需要依存树呢?词性只标记单个词而不是短语,因此不足以创建解析树。解析树是标记名词短语、动词短语或介词短语的地方,并且需要按照特定的顺序。
解析本质上是为文本序列分配结构的过程。句法解析涉及分析句子中的词以进行语法分析,并以显示词之间关系的方式排列它们。依存语法是句法文本分析的一个部分。它确定了句子中词之间的关系。这些关系中的每一个都以三元组的形式表示:关系、支配者和依赖者。通过递归解析观察到的词之间的关系以自上而下的方式表示,并被描绘成树状结构,这被称为依存树。
这些语法关系可以用作许多NLP问题的特征,如实体级情感分析、实体识别和文本分类。例如,让将句子“Bills on ports and immigration were submitted by Senator Brownback, Republican of Kansas.”以依存树的形式可视化表示:
来源:
自然语言解析器是一个程序,它确定哪些词组在一起(作为“短语”),哪些词是动词的主语或宾语。NLP解析器根据语法规则将一系列文本分割成更小的部分。如果一个句子不能被解析,可能存在语法错误。
解析器的第一步是确定句子的主语。解析器将文本序列分割成一系列相关的词,这些词以短语的形式相互关联。因此,得到的这些相互关联的词组被称为主语。
句法解析和词性,这些语言结构是基于结构或词的排列的上下文无关语法。它不是基于上下文的。
需要注意的重要一点是,语法在句法上总是正确的,即在句法上是正确的,可能在上下文上没有意义。
现在,让看看如何在Python中标记词并创建依存树。
使用NLTK库:
import nltk
nltk.download('punkt')
nltk.download('averaged_perceptron_tagger')
from nltk import pos_tag, word_tokenize, RegexpParser
text = "Reliance Retail acquires majority stake in designer brand Abraham & Thakore."
tokens = word_tokenize(text)
tags = pos_tag(tokens)
tags
块提取或部分解析是从句子中提取短语的过程(用词性标注)。块提取使用特殊的正则表达式语法来限定块。这些规则必须转换为“常规”正则表达式,然后才能对句子进行块提取。
为此,需要调用一个正则公式,一个正则模式——分配一个模式来识别动词短语或名词短语,这些小模式可以被识别,这被称为块提取。
chunker = RegexpParser("""
NP: {?*} #提取名词短语
P: {} #提取介词
V: {} #提取动词
PP: { } #提取介词短语
VP: { *} #提取动词短语
""")
result = chunker.parse(tags)
print('Our Parse Notation:', result)
result.draw()
使用spaCy库:
import spacy
# 加载模型
nlp=spacy.load('en_core_web_sm')
text = "Reliance Retail acquires majority stake in designer brand Abraham & Thakore."
# 创建Doc对象
doc=nlp(text)
# 获取依存标签
for token in doc:
print(token.text, '=>', token.dep_)
# 导入可视化工具
from spacy import displacy
# 可视化依存树
displacy.render(doc, jupyter=True)
词性(POS)和句法解析用于提取名词、动词和介词短语,它们是上下文无关语法。由于这些在句法上是正确的,可能在上下文上没有意义,因此需要某种形式的关联,即词嵌入,这将帮助为句子添加上下文。
使用结构化感知算法进行词性标注的最简单方法是将句子分解成一种标记,从左到右进行。