Wie baut man ein System auf?

PHP中文网
Freigeben: 2017-06-20 11:00:18
Original
2373 Leute haben es durchsucht

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.

Entitätserkennung: Chunking-Technologie

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.

Konstruktion der Chunked-Grammatik

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 = [(&#39;the&#39;,&#39;DT&#39;),(&#39;little&#39;,&#39;JJ&#39;),(&#39;yellow&#39;,&#39;JJ&#39;),(&#39;dog&#39;,&#39;NN&#39;),(&#39;brak&#39;,&#39;VBD&#39;)]
grammer = "NP: {<DT>?<JJ>*<NN>}"cp = nltk.RegexpParser(grammer) #生成规则result = cp.parse(sentence) #进行分块print(result)

result.draw() #调用matplotlib库画出来
Nach dem Login kopieren


  • kann eine Lücke definieren: }<VBD|IN>+{

import nltk
sentence = [(&#39;the&#39;,&#39;DT&#39;),(&#39;little&#39;,&#39;JJ&#39;),(&#39;yellow&#39;,&#39;JJ&#39;),(&#39;dog&#39;,&#39;NN&#39;),(&#39;bark&#39;,&#39;VBD&#39;),(&#39;at&#39;,&#39;IN&#39;),(&#39;the&#39;,&#39;DT&#39;),(&#39;cat&#39;,&#39;NN&#39;)]
grammer = """NP:             {<DT>?<JJ>*<NN>}            }<VBD|NN>+{            """  #加缝隙,必须保存换行符cp = nltk.RegexpParser(grammer) #生成规则result = cp.parse(sentence) #进行分块print(result)
Nach dem Login kopieren


  • 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.

Baumkarte

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(&#39;NP&#39;,[&#39;Alick&#39;])print(tree1)
tree2 = nltk.Tree(&#39;N&#39;,[&#39;Alick&#39;,&#39;Rabbit&#39;])print(tree2)
tree3 = nltk.Tree(&#39;S&#39;,[tree1,tree2])print(tree3.label()) #查看树的结点tree3.draw()
Nach dem Login kopieren


IOB-Tags

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.


Entwicklung und Evaluierung von Chunkern

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(&#39;train.txt&#39;)[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=[&#39;NP&#39;])
Nach dem Login kopieren


Für die zuvor definierten Regeln cp können Sie mit cp.evaluate(conll2000.chunked_sents(&#39;train.txt&#39;)[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))
Nach dem Login kopieren
Benannte Entität: eine exakte Nominalphrase, die sich auf einen bestimmten Typ von bezieht B. ein Datum, eine Person, eine Organisation usw.
. Wenn Sie selbst zum Klassifikator von Xu Yan gehen, wird es definitiv große Kopfschmerzen bereiten (ˉ▽ ̄~)~~. NLTK bietet einen trainierten Klassifikator--

. 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

Beziehungsextraktion
implementiert werden, um Informationen zu extrahieren. Eine Möglichkeit besteht darin, alle Tripel (X,a,Y) zu finden. Darunter,

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!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage