如何建構一個系統,用於從非結構化的文字中提取結構化的資訊和資料?哪些方法使用這類行為?哪些語料庫適合這項工作?是否可以訓練和評估模型?
資訊擷取,特別是結構化資訊擷取,可以類比資料庫的記錄。對應的關係綁定了對應的資料資訊。針對自然語言這類非結構化的數據,為了獲取對應關係,應該搜尋實體對應的特殊關係,並且用字串、元素等一些數據結構記錄。
實體辨識:分塊技術
例如:We saw the yellow dog ,依照分塊的思想,會將後三個字分到NP中,裡面的三個字又分別對應DT/JJ/NN;saw 分到VBD中;We 分到NP中。對最後三個字來說,NP就是組塊(較大的集合)。為了做到這一點,可以借助NLTK自帶的分塊語法,類似於正規表示式,來實現句子分塊。
分塊語法的建構
注意三點即可:
#基本的分塊:
組塊:{群組區塊下的子群組區塊}
(類似:"NP: {<dt>?<jj>*<nn>}"</nn></jj> </dt>
這樣的字串)。而?*+保存了正規表示式的意義。
import nltk sentence = [('the','DT'),('little','JJ'),('yellow','JJ'),('dog','NN'),('brak','VBD')] grammer = "NP: {<DT>?<JJ>*<NN>}"cp = nltk.RegexpParser(grammer) #生成规则result = cp.parse(sentence) #进行分块print(result) result.draw() #调用matplotlib库画出来
#可以為不包含再大塊中的識別碼序列定義一個縫隙:
}<vbd>+{</vbd>
import nltk sentence = [('the','DT'),('little','JJ'),('yellow','JJ'),('dog','NN'),('bark','VBD'),('at','IN'),('the','DT'),('cat','NN')] grammer = """NP: {<DT>?<JJ>*<NN>} }<VBD|NN>+{ """ #加缝隙,必须保存换行符cp = nltk.RegexpParser(grammer) #生成规则result = cp.parse(sentence) #进行分块print(result)
##可以遞歸式的調用,這符合語言結構中的遞歸嵌套。例如:
VP: {
。此時,
RegexpParser函數的參數
loop如果呼叫
print(type(result))檢視型別就會發現,是
nltk.tree. Tree
tree1 = nltk.Tree('NP',['Alick'])print(tree1) tree2 = nltk.Tree('N',['Alick','Rabbit'])print(tree2) tree3 = nltk.Tree('S',[tree1,tree2])print(tree3.label()) #查看树的结点tree3.draw()
IOB標記#分別代表內部,外部,開始(就是英文單字的首字母)。對於上面講的 NP,NN這樣的分類,只需要在前面加上 I-/B-/O-即可。這樣就能使規則外的集合被顯式出來,類似上面的加縫隙。
NLTK已經為我們提供了分塊器,減少了手動建構規則。同時,也提供了已經分塊好的內容,供我們自己建構規則時候進行參考。
#这段代码在python2下运行from nltk.corpus import conll2000print conll2000.chunked_sents('train.txt')[99] #查看已经分块的一个句子text = """ he /PRP/ B-NP accepted /VBD/ B-VP the DT B-NP position NN I-NP of IN B-PP vice NN B-NP chairman NN I-NP of IN B-PP Carlyle NNP B-NP Group NNP I-NP , , O a DT B-NP merchant NN I-NP banking NN I-NP concern NN I-NP . . O"""result = nltk.chunk.conllstr2tree(text,chunk_types=['NP'])
,可以使用
cp.evaluate(conll2000.chunked_sents(' train.txt')[99])### 來測試正確率。利用之前學過的Unigram標註器,可以進行名詞短語分塊,並且測試準確度######class UnigramChunker(nltk.ChunkParserI):""" 一元分块器, 该分块器可以从训练句子集中找出每个词性标注最有可能的分块标记, 然后使用这些信息进行分块 """def __init__(self, train_sents):""" 构造函数 :param train_sents: Tree对象列表 """train_data = []for sent in train_sents:# 将Tree对象转换为IOB标记列表[(word, tag, IOB-tag), ...]conlltags = nltk.chunk.tree2conlltags(sent)# 找出每个词性标注对应的IOB标记ti_list = [(t, i) for w, t, i in conlltags] train_data.append(ti_list)# 使用一元标注器进行训练self.__tagger = nltk.UnigramTagger(train_data)def parse(self, tokens):""" 对句子进行分块 :param tokens: 标注词性的单词列表 :return: Tree对象 """# 取出词性标注tags = [tag for (word, tag) in tokens]# 对词性标注进行分块标记ti_list = self.__tagger.tag(tags)# 取出IOB标记iob_tags = [iob_tag for (tag, iob_tag) in ti_list]# 组合成conll标记conlltags = [(word, pos, iob_tag) for ((word, pos), iob_tag) in zip(tokens, iob_tags)]return nltk.chunk.conlltags2tree(conlltags) test_sents = conll2000.chunked_sents("test.txt", chunk_types=["NP"]) train_sents = conll2000.chunked_sents("train.txt", chunk_types=["NP"]) unigram_chunker = UnigramChunker(train_sents)print(unigram_chunker.evaluate(test_sents))###############命名實體識別和資訊提取## #######命名實體:確切的名詞片語,指特定類型的個體,如日期、人、組織等### 。如果自己去許槤分類器肯定頭大(ˉ▽ ̄~)~~。 NLTK提供了一個訓練好的分類器--###nltk.ne_chunk(tagged_sent[,binary=False])### 。如果binary被設定為True,那麼命名實體就只被標註為NE;否則標籤會有點複雜。 ######
sent = nltk.corpus.treebank.tagged_sents()[22]print(nltk.ne_chunk(sent,binary=True))###############如果命名實體被確定後,就可以實現###關係抽取###來提取資訊。一個方法是:尋找所有的三元組(X,a,Y)。其中X和Y是命名實體,a是表示兩者關係的字串,範例如下:######
#请在Python2下运行import re IN = re.compile(r'.*\bin\b(?!\b.+ing)')for doc in nltk.corpus.ieer.parsed_docs('NYT_19980315'):for rel in nltk.sem.extract_rels('ORG','LOC',doc,corpus='ieer',pattern = IN):print nltk.sem.show_raw_rtuple(rel)#########
以上是如何建構一個系統?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

2小時內可以學會Python的基本編程概念和技能。 1.學習變量和數據類型,2.掌握控制流(條件語句和循環),3.理解函數的定義和使用,4.通過簡單示例和代碼片段快速上手Python編程。

Python在web開發、數據科學、機器學習、自動化和腳本編寫等領域有廣泛應用。 1)在web開發中,Django和Flask框架簡化了開發過程。 2)數據科學和機器學習領域,NumPy、Pandas、Scikit-learn和TensorFlow庫提供了強大支持。 3)自動化和腳本編寫方面,Python適用於自動化測試和系統管理等任務。

兩小時內可以學到Python的基礎知識。 1.學習變量和數據類型,2.掌握控制結構如if語句和循環,3.了解函數的定義和使用。這些將幫助你開始編寫簡單的Python程序。

如何在10小時內教計算機小白編程基礎?如果你只有10個小時來教計算機小白一些編程知識,你會選擇教些什麼�...

使用FiddlerEverywhere進行中間人讀取時如何避免被檢測到當你使用FiddlerEverywhere...

Python3.6環境下加載Pickle文件報錯:ModuleNotFoundError:Nomodulenamed...

如何解決jieba分詞在景區評論分析中的問題?當我們在進行景區評論分析時,往往會使用jieba分詞工具來處理文�...

如何使用正則表達式匹配到第一個閉合標籤就停止?在處理HTML或其他標記語言時,常常需要使用正則表達式來�...


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

Atom編輯器mac版下載
最受歡迎的的開源編輯器

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

Dreamweaver Mac版
視覺化網頁開發工具

記事本++7.3.1
好用且免費的程式碼編輯器