2012-02-23 2 views
0

Я пытаюсь извлечь все собственные имена из помеченного абзаца. Что я сделал в своем коде, так это то, что сначала я выделил абзац отдельно, а затем проверил, есть ли в нем какое-либо собственное имя. Но проблема в том, что я не смог извлечь собственное имя. Мой код даже не входит в цикл, где он проверяет конкретный тег.chunks using python

Мой код:

def noun(sen): 
m=[] 
if (sen.split('/')[1].lower().startswith('np')&sen.split('/')[1].lower().endswith('np')): 
     w=sen.strip().split('/')[0] 
     m.append(w) 
return m 


import nltk 
rp = open("tesu.txt", 'r') 
text = rp.read() 
list = [] 
sentences = splitParagraph(text) 
for s in sentences: 
list.append(s) 

Ввод пробы из '' tesu.txt

Several/ap defendants/nns in/in the/at Summerdale/np police/nn burglary/nn trial/nn  made/vbd statements/nns indicating/vbg their/pp$ guilt/nn at/in the/at.... 

Bellows/np made/vbd the/at disclosure/nn when/wrb he/pps asked/vbd Judge/nn-tl Parsons/np to/to grant/vb his/pp$ client/nn ,/, Alan/np Clements/np ,/, 30/cd ,/, a/at separate/jj trial/nn ./. 

Как извлечь все маркированные существительные из абзаца?

+0

Пожалуйста, покажите нам пример помеченного абзаца, иначе мы не можем сказать, правильно ли ваш код работает правильно. – DNA

+0

@ DNA Я дал образец ввода. Пожалуйста, подтвердите благодарность – user1052462

ответ

1

Спасибо за образец данных.

Вам нужно:

  • читать каждый пункт/линию
  • разделить строку пробелов, чтобы извлечь каждое помеченное слово, например, Summerdale/np
  • разделить слово на /, чтобы увидеть, если он помечен np
  • если да, то добавьте другую половину раскола (фактическое слово) в список существительного

Так что-то вроде следующего (! основанный на Богдан «s ответ, спасибо)

def noun(word): 
    nouns = [] 
    for word in sentence.split(): 
     word, tag = word.split('/') 
     if (tag.lower() == 'np'): 
     nouns.append(word); 
    return nouns 

if __name__ == '__main__': 
    nouns = [] 
    with open('tesu.txt', 'r') as file_p: 
     for sentence in file_p.read().split('\n\n'): 
       result = noun(sentence) 
       if result: 
        nouns.extend(result) 
    print nouns 

, который для примера данных, производит:

['Summerdale', 'Bellows', 'Parsons', 'Alan', 'Clements'] 

Update: На самом деле, вы можете сократить все это сводится к следующему:

nouns = [] 
with open('tesu.txt', 'r') as file_p: 
    for word in file_p.read().split(): 
    word, tag = word.split('/') 
    if (tag.lower() == 'np'): 
     nouns.append(word) 
print nouns 

, если вы не заботитесь, которые пункт существительные берутся.

Вы также можете избавиться от .lower(), если теги всегда имеют строчные буквы, как в вашем примере.

0

Вы должны работать над своим стилем кода. Я думаю, здесь много ненужных петель. У вас также есть ненужный метод в splitParagraph, который в основном вызывает только уже существующий метод split, а вы import re, но никогда не используете его впоследствии. Также укажите код, очень трудно следовать этому пути. Вы должны предоставить образец ввода от "tesu.txt", чтобы мы могли помочь вам больше. В любом случае, весь ваш код может быть компактным в:

def noun(sentence); 
    word, tag = sentence.split('/') 
    if (tag.lower().startswith('np') and tag.lower().endswith('np')): 
     return word 
    return False 

if __name__ == '__main__' 
    words = [] 
    with open('tesu.txt', 'r') as file_p: 
     for sentence in file_p.read().split('\n\n'): 
       result = noun(sentence) 
       if result: 
        words.append(result) 
+0

Большое спасибо ... за вашу помощь. но если я попробую с вашим кодом, он даст ошибку word, tag = sentence.split ('/') ValueError: слишком много значений для распаковки..и я дал образец ввода выше – user1052462