python自然语言分析_Python自然语言处理-分析句子结构
編輯推薦:
本文來自于csdn,文章介紹了Python自然語言處理如何識別它們,分析它們的結(jié)構(gòu),給它們分配詞匯類別,以及獲得它們的含義,希望對您的學(xué)習(xí)有所幫助。
目的是要回答下列問題:
(1)如何使用形式化語法來描述無限的句子集合的結(jié)構(gòu)?
(2)如何使用句法樹來表示句子結(jié)構(gòu)?
(3)解析器如何分析句子并自動構(gòu)建語法樹?
一、一些語法困境
#語言數(shù)據(jù)和無限可能性
文法的目的是給出一個明確的語言描述。而我們思考文法的方式與我們認(rèn)為什么是一種語言緊密聯(lián)系在一起。觀察到的言語和書面文本是否是一個大卻有限的集合呢?關(guān)于文法句子是否存在一些更抽象的東西,如有能力的說話者能理解的隱性知識?或者是兩者的某種組合?我們不會解決這個問題,而是將介紹主要的方法。
#普遍存在的歧義
重要的目的是自然語言understanding,當(dāng)識別一個文本所包含的語言結(jié)構(gòu)時,可以從中獲得多少文本的含義?一段程序在通讀了一個文本后,它能否足夠“理解”文本,并回答一些簡答的問題,如“發(fā)生了什么事“或”誰對誰做了什么“?還像以前一樣,我們將開發(fā)簡單的程序來處理已注釋的語料庫,并執(zhí)行有用的任務(wù)。
二、文法的用途
#超越n-grams
3、上下文無關(guān)文法
#一種簡單的文法
在NLTK中,上下文無關(guān)文法定義在nltk.grammar模塊
import nltk
from nltk import CFG
//grammar1 = CFG.fromstring("""
grammar1 = nltk.parse_cfg("""
s -> NP VP
VP -> V NP | V NP PP
PP -> P NP
V -> "saw" | "ate" | "walked"
NP -> "John" | "Mary" |
"Bob" | Det N | Det N PP
Det -> "a" | "an" | "the"
| "my"
N -> "man" | "dog" | "cat"
| "telescope" | "park"
P -> "in" | "on" | "by"
| "with"
""")
sent = "Mary saw Bob".split()
rd_parser = nltk.RecursiveDescentParser(grammar1)
for tree in rd_parser.nbest_parse(sent):
print tree
如果使用上述文法分析句子The dog saw a man in the park,結(jié)果將得到兩棵樹,被稱為結(jié)構(gòu)上有歧義
#編寫你自己的文法
編寫mygrammar.cfg
grammar1 = nltk.data.load('file:mygrammar.cfg')
#句法結(jié)構(gòu)中的遞歸
產(chǎn)生式左側(cè)的文法類型也出現(xiàn)在右側(cè),那么這個文法被認(rèn)為是遞歸的
四、上下文無關(guān)文法分析
解析器根據(jù)文法產(chǎn)生式處理輸入的句子,并建立一個或多個符合文法的組成結(jié)構(gòu)。
例如問答系統(tǒng)對提交的問題首先進(jìn)行文法分析
在本節(jié)中,我們將看到兩個簡單的分析算法,一種自上而下的方法稱為下降遞歸分析,一種自下而上的方法稱為移進(jìn)-歸約分析。
以及更復(fù)雜的算法,一種稱為左角落分析的帶自下而上過濾的自上而下的方法:一種稱為圖表分析的動態(tài)規(guī)劃技術(shù)
#遞歸下降解析器
nltk.RecursiveDescentParser(grammar1)
#移進(jìn)-歸約分析
nltk.ShiftReduceParser(grammar1)
#左角落解析器
帶自下而上過濾的自上而下的解析器
#符合語句規(guī)則的子串表
五、依存關(guān)系和依存文法
短語結(jié)構(gòu)文法是關(guān)于詞和詞序列如何結(jié)合形成句子成分的。
一種獨特且互補(bǔ)的方式,依存文法,集中關(guān)注的是詞與其他詞之間的關(guān)系。
依存關(guān)系是一個中心詞與其從屬之間的二元非對稱關(guān)系。一個句子的中心詞通常是動詞,所有其他詞要么依賴于中心詞,要么通過依賴路徑與它相關(guān)聯(lián)。
與短語結(jié)構(gòu)文法相比,依存文法可以作為一種依存關(guān)系用來直接表示語法功能。
#配價與詞匯
在表中的動詞被認(rèn)為具有不同的配價。配價限制不僅適用于動詞,也適用于其他類的中心詞。
#擴(kuò)大規(guī)模
文法是否可以擴(kuò)大到能覆蓋自然語言中的大型語料庫
使用各種正規(guī)工具
六、文法開發(fā)
如何訪問樹庫,及開發(fā)覆蓋廣泛文法所具有的挑戰(zhàn)
#樹庫和文法
corpus模塊定義了樹庫語料的閱讀器,其中包含了賓州樹庫語料10%的樣本
from nltk.corpus
import treebank
t = treebank.parsed_sents('wsj_0001.mrg')[0]
print t
(S
(NP-SBJ
(NP (NNP Pierre) (NNP Vinken))
(, ,)
(ADJP (NP (CD 61) (NNS years)) (JJ old))
(, ,))
(VP
(MD will)
(VP
(VB join)
(NP (DT the) (NN board))
(PP-CLR (IN as) (NP (DT a) (JJ nonexecutive) (NN
director)))
(NP-TMP (NNP Nov.) (CD 29))))
(. .))
!
def filter(tree):
#搜索樹庫找出句子的補(bǔ)語
child_nodes = [child.label for child in tree if
isinstance(child, nltk.Tree)]
#print tree.label
#print [t for t in tree if tree.label == 'NP']
return (tree.label == 'VP') and ('S' in child_nodes)
from nltk.corpus import treebank
[subtree for tree in treebank.parsed_sents()
for subtree in tree.subtrees(filter)]
entries = nltk.corpus.ppattach.attachments('training')
table = nltk.defaultdict(lambda: nltk.defaultdict(set))
for entry in entries:
key = entry.noun1 + '-' + entry.prep + '-' + entry.noun2
table[key][entry.attachment].add(entry.verb)
for key in sorted(table):
if len(table[key]) > 1:
print key, 'N:', sorted(table[key]['N']), 'V:',
sorted(table[key]['V'])
nltk.corpus.sinica_treebank.parsed_sents()[3450].draw()
#有害的歧義
歧義文法
#加權(quán)文法
處理歧義是開發(fā)覆蓋廣泛的解析器的主要任務(wù)。圖表解析器提高了計算同一個句子的多個分析的效率,但它們?nèi)匀粫蚩赡艿姆治鰯?shù)量過多而不堪重負(fù)。加權(quán)文法和概率分析算法為這些問題提供了有效的解決方案
def give(t):
return t.label == 'VP' and len(t) > 2 and t[1].label
== 'NP' \
and (t[2].label == 'PP-DTV' or t[2].label == 'NP')
\
and ('give' in t[0].leaves() or 'gave' in t[0].leaves())
def sent(t):
return ' '.join(token for token in t.leaves()
if token[0] not in '*-0')
def print_node(t, width):
output = "%s %s: %s / %s: %s" %\
(sent(t[0]), t[1].label, sent(t[1]), t[2].label,
sent(t[2]))
if len(output) > width:
output = output[:width] + "..."
print output
for tree in nltk.corpus.treebank.parsed_sents():
for t in tree.subtrees(give):
print_node(t, 72)
#概率上下文無關(guān)文法(PCFG)
grammar = nltk.parse_pcfg("""
S -> NP VP [1.0]
VP -> TV NP [0.4]
VP -> IV [0.3]
VP -> DatV NP NP [0.3]
TV -> 'saw' [1.0]
IV -> 'ate' [1.0]
DatV -> 'gave' [1.0]
NP -> 'telescopes' [0.8]
NP -> 'Jack' [0.2]
""")
總結(jié)
以上是生活随笔為你收集整理的python自然语言分析_Python自然语言处理-分析句子结构的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 解决win11蓝牙开关不显示问题,没有更
- 下一篇: python必备单词整理_别乱找了,Py