2016-05-17 16 views
7

Python ve NLP dünyasında yeniyim. Google'ın Syntaxnet'inin son duyurusu beni şaşırttı. Ancak etrafında sorun anlama belgelerin bir yaşıyorum syntaxnet ve ilgili araçlar (nltk, vs.) hemSyntaxNet Kök ağacına fiil oluşturma

Amacım: Ben kök fiil ayıklamak istiyorum "Wilbur topu tekmeledi" gibi bir giriş verilmiş (tekme) ve nesne "top" ile ilgilidir.

ben "spacy.io" tökezledi ve this visualization ben başarmaya çalışıyorum neyi saklanması görünüyor: Ben kök fiil başlar ve çapraz böylece POS etiketi bir dize ve ağaç yapısı çeşit içine yüklemek cümle.

Syntaxnet/demo.sh ile oynandım ve this thread'da önerildiği gibi, conll çıkışı almak için son birkaç satırı yorumladı.

Sonra (muhtemelen düzeltmez birlikte kludged kendimi) bir python komut dosyası bu girişi yüklenen:

import nltk 
from nltk.corpus import ConllCorpusReader 
columntypes = ['ignore', 'words', 'ignore', 'ignore', 'pos'] 
corp = ConllCorpusReader('/Users/dgourlay/development/nlp','input.conll', columntypes) 

ben corp.tagged_words() erişimi olduğunu görüyorum ama sözcükler arasında hiçbir ilişki. Şimdi sıkıştım! Bu corpus'u ağaç tipi bir yapıya nasıl yükleyebilirim?

Herhangi bir yardım çok takdir edilmektedir!

+0

Bana göre ayrıştırma parçasını kaçırdınız. Verilerinizi önceden kaydettikten sonra, ham metni, POS etiketini belirtin ve bunu birleşik biçime dönüştürün, onu ayrıştırıcıya iletmeniz gerekir (sizin durumunuzda SyntaxNet). Sonra, ayrıştırıcı çıktısında istediğiniz herhangi bir çıkarma işlemini yapabilirsiniz. – Riyaz

cevap

2

Yapmaya çalıştığınız şey bağımlılık bulmaktır, yani dobj. SyntaxNet/Parsey ile bu bağımlılığı çıktısından tam olarak nasıl çıkarılacağını anlatmak için henüz yeterince tanıdık değilim ama bu answer'un size yardımcı olabileceğine inanıyorum. Kısacası, Parsey'i çıktı için ConLL sözdizimini kullanacak şekilde konfigüre edebilir, onu kolayca hareket ettirebilir bulursanız oraya ayrıştırabilir, ardından nesneleri bulmak için fiil ve * obj bağımlılıklarını bulmak için KÖK bağımlılığını arayın.

+1

Teşekkürler. Yaptığım parçanın ConLL çıkışını ayrıştırdığını varsayalım. Yukarıdaki örneğimde gördüğünüz gibi ConllCorpusReader'ı kullanarak yükledim, ancak kök fiilden bir ağaç olarak nasıl geçeceğini anlayamıyorum. –

3

Bu bir yorum olarak daha iyi olabilir, ancak henüz gerekli bir itibara sahip değilim.

Daha önce ConllCorpusreader'ı kullanmamıştım (yüklediğiniz dosyayı bir ana bilgisayara yüklemeyi ve bir bağlantı sağlamayı düşünür müsün? Bunu test etmek çok daha kolay olurdu), ancak bir blog yazısı yazdım. ağaç ayrıştırma yönü: here. Özellikle her bir cümleyi parçalamak isteyebilirsiniz. Chapter 7 of the NLTK book Bu konuda biraz daha bilgi var, ama bu benim blogdan örnektir:

# This grammar is described in the paper by S. N. Kim, 
# T. Baldwin, and M.-Y. Kan. 
# Evaluating n-gram based evaluation metrics for automatic 
# keyphrase extraction. 
# Technical report, University of Melbourne, Melbourne 2010. 
grammar = r""" 
NBAR: 
    # Nouns and Adjectives, terminated with Nouns 
    {<NN.*|JJ>*<NN.*>} 

NP: 
    {<NBAR>} 
    # Above, connected with in/of/etc... 
    {<NBAR><IN><NBAR>} 
""" 

chunker = nltk.RegexpParser(grammar) 
tree = chunker.parse(postoks) 

Not: Ayrıca (Chapter 8 kaplı) Bağlam Serbest Gramer kullanabilirsiniz.

Her parçaya ayrılmış (veya ayrıştırılmış) tümce (veya bu örnekte, yukarıdaki dilbilgisine göre Noun Deyimi) bir alt ağaç olacaktır. Kelime-etiket çiftlerinin bir liste olacak vermiştir nesnelerin her biri

def leaves(tree): 
    """Finds NP (nounphrase) leaf nodes of a chunk tree.""" 
    for subtree in tree.subtrees(filter = lambda t: t.node=='NP'): 
    yield subtree.leaves() 

: Bu alt ağaçlar erişmek için, bu işlevi kullanabilirsiniz. Oradan fiili bulabilirsiniz.

Sonraki, yukarıdaki dilbilgisi veya ayrıştırıcı ile oynayabilirsiniz. Fiiller isim cümlelerini ayırır (bkz. this diagram in Chapter 7), böylece VBD'dan sonra ilk NP'a erişebilirsiniz.

Sorununuza özel olmayan çözüm için özür dilerim, ancak umarım faydalı bir başlangıç ​​noktasıdır. Dosyayı yüklerseniz, başka bir çekim yapacağım :)

0

Hamlörü ne tür ayrıştırıcı kullanarak conll biçiminde ayrıştırdıysanız, bir düğümün bağımlılarını geçmek için aşağıdaki adımları izleyin. ilgilenen:

  1. yapı çıktı conll cümle bir komşuluk matrisi
  2. Eğer (sizin durumunuzda fiil) ilgilenen ve komşuluk matrisi onun bakmakla ayıklamak düğüm için
  3. göz (endeksler)
  4. için Her bağımlı bağımlılık etiketi, conll formatında 8. sütunda.

Not: Kodu sağlayabilirim, ancak kendiniz kodlayabilirsiniz, daha iyi olurdu.