在编译原理课程中,我们知道有4种文法:0型、1型、2型、3型。本文将对他们的区别进行描述。 0型文法 0型文法是“无限制文法”、“短语结构文法“,它对产生式几乎没有限制。 _2时,它才能推出\beta,因此它是上下文有关的。 与定义的 | \alpha | \le | \beta | 相矛盾,因此1型文法不包含空产生式。 2型文法 2型文法称为“上下文无关文法”(CFG)。2型文法要求其产生式左部必须为非终结符。 2型文法的产生式的一般形式为: A \Rightarrow \beta 3型文法 3型文法又称为“正则文法”(RG)。它分为左线性文法和右线性文法两种。 它在2型文法的基础上,进一步对产生式的右部进行限制。 右线性文法: A \Rightarrow wB 或 A \Rightarrow w .
2. 文法 2.1 文法在语言体系中的位置 语言包括语法和语义两个方面,但是语法和语义都是比较抽象的东西,所以我们需要借助一些工具来阐述它们。以语法来说,文法就是阐述它的一个工具。 (2)VN: VN 指的是非终结符集合。非终结符即 nonterminal symbol,它是用来表示语法成分的符号,有时候也称为“语法变量”。 (2)推导: 推导指的是从文法的开始符号出发,反复连续地使用产生式,对非终结符施行替换和展开,最终得到一个仅由终结符构成的符号串,推导过程的每一步都是一个直接推导。 (2) 1 型文法 在 0 型文法的基础上加以限制,规定对于每一个 α→β,都必须满足 |α| <= |β|。也就是说,产生式左部符号串长度必须小于等于右部符号串长度。 (3) 2 型文法 在 1 型文法的基础上加以限制,规定对于每一个 α→β,都必须满足 α 是一个非终结符。也就是说,产生式左部必须得是一个非终结符。 2 型文法也叫上下文无关文法。
与此相对的上下文有关文法例如aSb -> abab 就是上下文有关文法。 推导 把产生式看成重写规则,符号串中的非终结符用产生式右部的串(α)代替。 推导具有自反性,传递性。 因此先匹配digit和()的文法。 符号如下: 1)A→Aβ,A∈VN,β∈V 2)A→Bβ,B→Aα,A、B∈VN,α、β∈V* 以上两种情况都出现了左递归,即自己推出和自己有关的东西。 左递归消除: 1.直接左递归 使用公式: (原始) A → Aα1 | Aα2 | … | Aαm| β1 | β2 | … | βn (转化) A → β1 A’ | β2 A’ | … | βn A’ A’ → α1A’ | α2A’| … | αmA’ | e 2.间接左递归 间接左递归就是要通过多次推导才能看出文法有左递归。
,即0型、1型、2型和3型。 文法类型 产生式的限制 文法产生的语言 0型文法 α→β 其中α、β∈(VT∪VN) *,∣α∣≠0 0型语言 1型文法 α→β 其中α、β∈(VT∪VN) *,∣α∣≤∣β∣ 1型语言,即上下文有关语言 2型文法 A→β 其中A∈VN,β∈(VT∪VN) * 2型语言,即上下文无关语言 3型文法 A→α|αB(右线性)或A→α|Bα(左线性) 其中,A,B∈VN,α∈VT∪{ ε} 3型语言 例:A→a,A→ab,Aa→BAc(左边至少有一个大写字母,且左边的长度小于等于右边的长度) 2型文法:每一个A→β都有A是非终结符 例:A→a,A→ab,AB→BAc(在1型文法的前提下,左边必须都是大写字母 ) 3型文法:如有:A→a,A→aB,B→a,B→cB,则符合3型文法的要求。
(\sum)^+=\sum U (\sum)^2 U(\sum)^3....(∑)+=∑U(∑)2U(∑)3.... (\sum)^*=(\sum)^0 U(\sum) U (\sum)^2 U(\sum)^ 3....(∑)∗=(∑)0U(∑)U(∑)2U(∑)3.... 产生式的简写 对于一组由相同左部的α产生式:α->β1,α->β2,α->β3…… 可以简写为:α->β1|β2|β3…… 读作:α定义为β1,或者β2,或者β3…… β1,β2,β3……称为α的候选式 文法分类体系 0、1、2、3型文法 0型文法 无限制文法,对于任意一个推导式α->β,α中至少包含一个非终结符 由0型文法G生成的语言L(G)叫做0型语言。 由上下文有关文法(1型文法)生成的语言L(G)叫做上下文有关语言。 2型文法 α必须属于终结符。 由上下文无关文法(2型文法)生成的语言L(G)叫做上下文无关语言。
RNNG,不同于传统的PCFG之类的文法,RNNG使用RNN来对句子和它的句法树的联合概率进行建模,因此它是一个生成模型。 因此本文提出了一种利用RNN建模出来的全新文法RNNG,建立在句子的句法结构之上,消除了PCFG的上下文无关假设。 RNN文法 RNNG定义为三元组 ? ,其中 ? 是非终结符集合, ? 是终结符集合,并且 ? , ? 就是神经网络的参数集合。 图1就是每个动作的状态变化过程,图2是判别式模型进行句法分析的示例: ? 当然得给动作添加一些限制,首先记当前状态为三元组 ? 总结 RNNG这个文法是个生成式模型,建模了句子和句法树的联合分布,稍稍修改即可应用到句法分析和语言模型中,效果也非常的好。
3.2型文法(上下文无关文法) 如果对于某文法G,P中的每个规则具有下列形式: U :: = u 其中U∈VN;u∈V+,则称该文法G为2型文法或上下文无关文法,简写为CFG。 2型文法所确定的语言为2型语言L2,2型语言可由非确定的下推自动机来识别。 一般定义程序设计语言的文法是上下文无关的。如C语言便是如此。因此,上下文无关文法及相应语言引起了人们较大的兴趣与重视。 可以看出,上述4类文法,从0型到3型,产生式限制越来越强,其后一类都是前一类的子集,而描述语言的功能越来越弱,四类文法及其表示的语言之间的关系可表示为: 0型 1型 2型 3型;即L0 L1 L2 isupper(G.P[i].right[0])|| 2==G.P[i].right.size()&&! 2型文法实验结果 ? 3型文法实验结果 ? 困难与解决方法 数据结构的建立 为了便于以后实验的代码复用,需要建立一个良好的数据结构类型。
内积 对于分类问题,我们不再像回归问题那样,找出直线的斜率和截距。为了方便理解,将拥有一个特征的回归问题所绘制的图示和拥有两个特征的分类问题绘制的图示进行对比。 回归问题使用一个特征绘制和分类问题使用两个特征绘制的图示,虽然都是拥有横纵坐标的平面图,但是它们之间存在本质的区别。 我们为分类问题中的直线取一个新名字:决策边界(decision boundary),把决策边界定义为: w\cdot x = 0 图片 w\cdot x = w_1x_1 + w_2x_2 既然是分类问题的决策边界 图片 \begin{split} w\cdot x &= w_1x_1 + w_2x_2 \\ &=1\cdot x_1 + 1\cdot x_2\\ &= x_1+x_2 \end{split} 图片 \begin{split} w\cdot x &= w_1x_1 + w_2x_2 \\ &=1\cdot 1 + 1\cdot 1\\ &= 2 >0 \end{split} 图片 \begin{
,把间接左递归文法改写为直接左递归文法,然后用消除直接左递归的方法改写文法。 消除左递归算法: 把文法G的所有非终结符按任一顺序排列,例如,A1,A2,…,An。 全部规则; 消除Ai规则中的直接左递归; } 化简由(2)所得到的文法,即去掉多余的规则。 =string::npos) //寻找文法中的|符号,如果h找不到则退出 { flag2=principle[i].find_first_of("|",flag1+1); //在文法中找到第 遇到的难点和解决方案 由于文法的形式多种多样,在消除递归时要考虑到各种情况,一般来说,首先要解决统一文法格式,因此需要将具有相同非终结符左部的文法用|符号合并。
递归下降程序 递归下降程序一般是针对某一个文法的。而递归下降的预测分析是为每一个非终结符号写一个分析过程,由于文法本身是递归的,所以这些过程也是递归的。 以上是前提。 Sample 假如给的是正规式子,首先要做的是将其改为文法表示: (int∣float)id(,id)∗(int | float) id(,id)^*(int∣float)id(,id)∗ 以上式子为例 ,将其改为文法表示 D−−>TLD --> TLD−−>TL T−−>int∣floatT-->int | floatT−−>int∣float L−−>L,id∣idL (lookahead, 5); if (m1 == "int") { lookahead += 3; } else if (m2 =="float") { lookahead += 5; m4 = str.substr(lookahead, 2); if (m4 == "id") { lookahead += 2; R(); } else error();
现在再定义一个集合U和V的连接积的概念: UV = {αβ | α∈U,β∈V} 比如A = {a,b},B = {1,2},则AB={a1,a2,b1,b2}。很简单的概念,是不是? 那么相信你也能知道V1,V2等的幂的概念了。 还有几个: ok,定义结束,现在来谈谈咱们本次的主角——文法。一个比较拗口的定义, 文法是描述语言的语法结构的形式规则(即语法规则)。 那么怎么从文法推导出它代表的语言嘞? 为了方便,我们引入一些符号。 方法:把产生式看成替换规则,把当前符号串中的非终结符号用其产生式右边的符号来替换。 再看有文法G2->语言L(G2)例子。 推导过程如下: 语言L(G2)-> G2 的例子。 由上面的两个例子我们可以知道,一个文法可以唯一确定一个语言,但是一个语言不一定唯一对应一个文法。 注意,文法的二义性和我们通常所说的语言的二义性不同,我们可能有两个不同的文法G1,G2,一个是二义性,一个是非二义性,但是可能L(G1) = L(G2)。
若Z 0步以上推导出x,则称x是文法G的句型2.句子 有文法GZ,若Z 1步以上推导出且x都是终结符号,则称x是文法G的句子例:GS,S→0S1,S→01S⇒0S1⇒00S11⇒000S111⇒00001111G 例:2.6 文法的分类对文法中的不同规则施加不同的限制,将文法和语言分为四大类0型文法:0型语言或短语结构语言1型文法:1型语言或上下文有关语言==2型文法==:2型语言或上下文无关语言2型文法是程序设计语言语法规则 ==3型文法==:3型语言或正则语言3型文法是程序设计语言构词规则2.6.1 0型文法对产生式基本无限制2.6.2 1型文法文法左部符号个数不超过右部符号个数2.6.3 2型文法任意产生式A→B,A属于非终结符号 如上小节给出语法树中,包含根节点S,S1,S2,S3,S4的五棵子树注意叶子结点不算子树短语短语是相对一个句型的,一个句型对应多个短语。短语就是该句型子树的叶子结点如何寻找一个句型短语? 1.画出句型语法树2.找出所有子树3.子树叶子结点组成的符号串为该句型针对子树根节点的短语4.去掉重复的短语找短语的关键还是找子树简单短语与句柄所有短语中,一步推导得来的即为简单短语。
train_df = pd.read_csv(train_path, sep='\t', nrows=15000) train_df['text'] train_df['label'] 4、进行文本分类 (1)n-gram+岭分类 vectorizer = CountVectorizer(max_features=3000) train_test = vectorizer.fit_transform( TF-IDF+岭分类 tfidf = TfidfVectorizer(ngram_range=(1,3), max_features=3000) train_test = tfidf.fit_transform :阿尔法对模型的影响 sample = train_df[0:5000] n = int(2*len(sample)/3) tfidf = TfidfVectorizer(ngram_range=(2,3 f1.append(f1_score(test_y, val_pred, average='macro')) tfidf = TfidfVectorizer(ngram_range=(2,2
文:徐超,《React进阶之路》作者 授权发布,转载请注明作者及出处 ---- React 深入系列2:组件分类 React 深入系列,深入讲解了React中的重点概念、特性和模式等,旨在帮助大家加深对 React 组件有很多种分类方式,常见的分类方式有函数组件和类组件,无状态组件和有状态组件,展示型组件和容器型组件。好吧,这又是一篇咬文嚼字的文章。
感谢大家的关注,在上一篇文章中发布后很多热心的小伙伴建议我可以改进下分类的方式,一种是根据学习的方式分类,另外一种是根据类似的形式或者功能进行分类,我几天一直在想这的确是一直很好的分类方式,所以在这几天搜集资料进行分类 常用于解决的问题是分类和回归。常用的算法是对所有的无标签的数据建模进行的预测算法(可以看做无监督学习的延伸) 2:从功能角度分类 1:回归算法:回归分析是研究自变量和因变量之间关系的一种预测模型技术。 常用的回归算法包括: 普通最小二乘回归(OLSR),线性回归,逻辑回归,逐步回归,多元自适应回归样条法(MARS),局部估计平滑散点图(LOESS) 2:基于实例的学习算法:基于实例的学习通过训练数据样本或者实例建模 常见的决策树算法包括: 分类和回归树(CART) ID3算法,C4.5和C5.0算法,这是一种算法的两种不同版本,CHAID算法,单层决策树,M5算法,条件决策树 5:贝叶斯算法:贝叶斯方法指的是那些明确可以使用贝叶斯定理解决分类和回归问题的算法 很多的降维算法经过修改后,也可以被用于分类和回归问题。
前言 不可避免的要用dropwizard作为service框架。持续学习。上次在dropwizard中使用feign,使用hystrix, 算是基本入门了。接下来就是基于此的优化。 把需要使用Configuration的逻辑从Application里分离出来 在开始的demo中,由于不知道dropwizard怎么传播类,怎么注入, 把所有的初始化的东西都放到Application里去new出来。现在发现有办法可以分离部分配置逻辑。 现在把feign的基础配置抽离出来: public class Conne
score = int(input('分数: ')) if score >= 60 and score < 70: print('及格') elif 70 <= score < 80: print('良') elif 80 <= score < 90: print('好') elif score >= 90: print('优秀') else: print('你要努力了')
在阅读这篇文章之前,我希望大家可以已经有以下的知识积累作为基础,像是概率论里的基本概念,比如最大似然估计,贝叶斯分类,贝叶斯决策理论等等,甚至是一些包括信息论的简单基本概念,比如信息熵等,并且如果能对简单的形式语言可以理解就更加完美了 在前几篇我的关于形式语言的文章中,我们大致可以理解到形式语言有以下的几个缺陷: 1:比如像汉语,英语这样的大型的自然语言系统,形式语言就比较难以构造精确的文法. 2:形式语言的逻辑规则太过于复杂,实际上并不符合我们的学习语言的习惯 . 3:有一些句子.比如你这句子的文法是正确的,但是实际上在我们的生活中是不可能发生的,形式语言是无法识别这些句子的. 就按照三元文法为例: 在之前的介绍中,我们可以认为这是一个词的概率实际上只是跟前边的词有关,那么就可以有以下的方程: ? 这个句子出现的概率为0.06,这也就是n元文法的一个简单应用. 下一篇文章我们将讲述下模型的选择以及模型的性能评估.
在阅读这篇文章之前,我希望大家可以已经有以下的知识积累作为基础,像是概率论里的基本概念,比如最大似然估计,贝叶斯分类,贝叶斯决策理论等等,甚至是一些包括信息论的简单基本概念,比如信息熵等,并且如果能对简单的形式语言可以理解就更加完美了 在前几篇我的关于形式语言的文章中,我们大致可以理解到形式语言有以下的几个缺陷: 1:比如像汉语,英语这样的大型的自然语言系统,形式语言就比较难以构造精确的文法. 2:形式语言的逻辑规则太过于复杂,实际上并不符合我们的学习语言的习惯 . 3:有一些句子.比如你这句子的文法是正确的,但是实际上在我们的生活中是不可能发生的,形式语言是无法识别这些句子的. n-1的词相同时,如果E1=E2,呢么就说里边的历史是相同的. 对于n>2的n元语法模型,条件概率中药考虑前面的n-1个词的概率,为了使n>2成立,我们取: 请看下面的例子,假设训练语料S由下面的三个句子组成: 1:BROWN READ HOLY BIBLE 2:
一、文法的直观概念 以定义描述英语句子的文法为例:He gave me a book 文法的规则如下: (1)<句子>→<主语><谓语><间接宾语><直接宾语> (2)<主语>→<代词> (3)<谓语> 例:G[E]:E→E + E|E * E|( E )|i,文法G所描述的语言:含有+、*和括号的算术表达式 3.7 文法等价性 若L(G1)=L(G2),则称文法G1和G2是等价的(它们产生的句子集合相同 ) 例子: 文法 G_1[E]:E→E+E | E*E |(E)| i 文法 G_2[E]:E→E+T | T,T→T*F | F,F→(E)| i 因为L(G_1)=L(G_2),所以文法G_1和G 4.3 2型文法(上下文无关文法) 对任一产生式α→β,都有α∈V_N,β∈(V_N∪V_T)^* 例如 E→E+T|T,足以描述大多数程序设计语言语法特征 4.4 3型文法(正规文法) 右线性文法:对任一产生式的形式都为 G1[E]: E → E + E | E * E|( E )|i ,G1是二义性文法 G2[E]: E → E+T|T,T → T*F|F,F →(E)|i,G2(E)是无二义性文法,两者等价。