Wie baut man ein System zum Extrahieren strukturierter Informationen und Daten aus unstrukturiertem Text auf? Welche Methoden nutzen diese Art von Verhalten? Welche Korpora eignen sich für diese Arbeit? Ist es möglich, das Modell zu trainieren und auszuwerten?
Die Informationsextraktion, insbesondere die strukturierte Informationsextraktion, kann mit Datenbankeinträgen verglichen werden. Die entsprechende Beziehung bindet die entsprechenden Dateninformationen. Um bei unstrukturierten Daten wie natürlicher Sprache die entsprechende Beziehung zu erhalten, sollte die der Entität entsprechende spezielle Beziehung mithilfe einiger Datenstrukturen wie Zeichenfolgen und Elemente gesucht und aufgezeichnet werden.
Zum Beispiel: Wir haben den gelben Hund gesehen, entsprechend der Chunking-Idee werden die letzten drei Wörter in NP und das unterteilt drei Wörter im Inneren. Jedes Wort entspricht DT/JJ/NN. Saw ist in VBD unterteilt. Für die letzten drei Wörter ist NP der Chunk (größere Menge). Um dies zu erreichen, können Sie die NLTK-eigene Chunking-Syntax, ähnlich wie bei regulären Ausdrücken, verwenden, um Satz-Chunking zu implementieren.
Achten Sie einfach auf drei Punkte:
Grundlegendes Chunking: 组块 :{组块下的子组块}
(ähnlich: "NP: {<DT>?<JJ>*<NN>}"
So eine Zeichenfolge). Und ?*+ speichert die Bedeutung des regulären Ausdrucks.
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库画出来
kann eine Lücke definieren: }<VBD|IN>+{
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)
kann ein rekursiver Aufruf sein, der der rekursiven Verschachtelung in der Sprache entspricht Struktur. Zum Beispiel: VP: {<NP|PP|CLAUSE>*} PP:{<NN><VP>}
. Zu diesem Zeitpunkt kann der Parameter RegexpParser
der Funktion loop
auf 2 gesetzt und mehrmals wiederholt werden, um Auslassungen zu vermeiden.
Wenn Sie print(type(result))
aufrufen, um den Typ anzuzeigen, werden Sie feststellen, dass es sich um nltk.tree.Tree
handelt. Wie der Name schon sagt, handelt es sich um eine baumartige Struktur. nltk.Tree
Kann eine Baumstruktur realisieren und unterstützt die Spleißtechnologie, indem es Knotenabfragen und Baumzeichnungen ermöglicht.
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()
repräsentieren intern, extern bzw. den Anfang (die ersten Buchstaben englischer Wörter). Bei den oben genannten Klassifizierungen wie NP und NN müssen Sie nur I-/B-/O- voranstellen. Dadurch können Sammlungen außerhalb der Regeln offengelegt werden, ähnlich wie beim Hinzufügen von Lücken oben.
NLTK stellt uns bereits Chunker zur Verfügung, wodurch manuelle Bauregeln reduziert werden. Gleichzeitig stellt es auch Inhalte bereit, die als Referenz für die Erstellung unserer eigenen Regeln in Blöcke unterteilt wurden.
#这段代码在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'])
Für die zuvor definierten Regeln cp
können Sie mit cp.evaluate(conll2000.chunked_sents('train.txt')[99])
die Genauigkeit testen. Mit dem zuvor erlernten Unigram-Tagger können wir Nominalphrasen in Blöcke segmentieren und die Genauigkeit der Erkennung benannter Entitäten und der Informationsextraktion testen.
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))
. Wenn „Binary“ auf „True“ gesetzt ist, werden benannte Entitäten nur als NE markiert; andernfalls sind die Tags etwas komplizierter.
nltk.ne_chunk(tagged_sent[,binary=False])
Wenn die benannte Entität bestimmt ist, kann
Das obige ist der detaillierte Inhalt vonWie baut man ein System auf?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!