2012-06-30 8 views
5

आप एक HTML पृष्ठ को मुफ्त टेक्स्ट, सूचियों, तालिकाओं, शीर्षलेख इत्यादि के साथ वाक्यों में कैसे पार्स करते हैं?एचटीएमएल को वाक्यों में पार्स करना - तालिकाओं/सूचियों/शीर्षलेखों/आदि को कैसे संभालना है?

उदाहरण के लिए this wikipedia page लें। है वहाँ/कर रहे हैं:

अजगर NLTK साथ चारों ओर खिलवाड़ के बाद, मैं इन विभिन्न के सभी बाहर का परीक्षण करना चाहते कॉर्पस एनोटेशन विधियां (http://nltk.googlecode.com/svn/trunk/doc/book/ch11.html#deciding-which-layers-of-annotation-to-include से):

  • शब्द टोकनकरण: टेक्स्ट का ऑर्थोग्राफिक रूप अनजाने में अपने टोकन की पहचान नहीं करता है। परंपरागत ऑर्थोग्राफिक संस्करण के अलावा, एक टोकनयुक्त और सामान्यीकृत संस्करण, एक बहुत ही सुविधाजनक संसाधन हो सकता है।
  • वाक्य सेगमेंटेशन: जैसा कि हमने अध्याय 3 में देखा था, वाक्य विभाजन ऐसा लगता है उससे कहीं अधिक कठिन हो सकता है। कुछ निगम इसलिए वाक्य विभाजन को चिह्नित करने के लिए स्पष्ट एनोटेशन का उपयोग करते हैं।
  • पैराग्राफ सेगमेंटेशन: पैराग्राफ और अन्य संरचनात्मक तत्व (शीर्षक, अध्याय इत्यादि) स्पष्ट रूप से एनोटेटेड हो सकते हैं।
  • भाषण का हिस्सा: दस्तावेज़ में प्रत्येक शब्द की वाक्य रचनात्मक श्रेणी।
  • सिंटेक्टिक संरचना: एक पेड़ संरचना एक वाक्य की घटक संरचना दिखाती है।
  • शैलो सेमेटिक्स: नामित इकाई और कोरिफरेंस एनोटेशन, अर्थात् भूमिका लेबल।
  • वार्ता और प्रवचन: बातचीत अधिनियम टैग, बयानबाजी संरचना

एक बार जब आप वाक्य में एक दस्तावेज़ को तोड़ने यह बिल्कुल स्पष्ट लगता है। लेकिन आप उस विकिपीडिया पेज से HTML की तरह कुछ तोड़ने के बारे में कैसे जाते हैं? मैं एचटीएमएल/एक्सएमएल पार्सर्स का उपयोग करने और पेड़ को घुमाने के लिए बहुत परिचित हूं, और मैंने सादा पाठ प्राप्त करने के लिए केवल HTML टैग को अलग करने की कोशिश की है, लेकिन HTML हटा दिए जाने के बाद विराम चिह्न गायब है, एनएलटीके तालिका कोशिकाओं जैसी चीजों का विश्लेषण नहीं करता है, या यहां तक ​​कि सूचियां भी सही ढंग से।

क्या एनएलपी के साथ उस सामान को पार्स करने के लिए कुछ सर्वोत्तम अभ्यास या रणनीति है? या क्या आपको उस व्यक्तिगत पृष्ठ पर विशिष्ट रूप से एक पार्सर लिखना है?

बस सही दिशा में कुछ पॉइंटर्स की तलाश में, वास्तव में इस एनएलटीके को आजमाएं!

+0

क्या आपने पंकेट (इसे एनएलटीके में कार्यान्वित किया है) का उपयोग करके छीनने वाले पाठ पर यह देखने के लिए प्रयास किया है कि यह आपको कहीं भी ले जाता है या नहीं? – dmh

+1

मेरा अनौपचारिक अवलोकन यह है कि पार्सर्स आमतौर पर प्रदर्शन टेक्स्ट (प्रदर्शन करने वाले गद्य के विरोध में) को संभालने और प्रतिनिधित्व करने में खराब होते हैं। यदि आप एक अच्छा समाधान ढूंढते हैं या तैयार करते हैं, तो कृपया यहां फ़ॉलो करें! – tripleee

उत्तर

1

लगता है जैसे आप सभी HTML को अलग कर रहे हैं और एक फ्लैट दस्तावेज़ उत्पन्न कर रहे हैं, जो पार्सर को भ्रमित करता है क्योंकि ढीले टुकड़े एक साथ फंस जाते हैं। चूंकि आप एक्सएमएल के साथ अनुभव कर रहे हैं, इसलिए मैं आपके इनपुट को एक साधारण एक्सएमएल संरचना में मैपिंग करने का सुझाव देता हूं जो टुकड़ों को अलग रखता है। आप जितना चाहें उतना सरल बना सकते हैं, लेकिन शायद आप कुछ जानकारी बरकरार रखना चाहेंगे। उदाहरण के लिए, यह शीर्षक, खंड शीर्षलेख इत्यादि को ध्वजांकित करने के लिए उपयोगी हो सकता है। जब आपके पास एक व्यावहारिक एक्सएमएल पेड़ होता है जो टुकड़ों को अलग रखता है, तो इसे एनएलटीके ब्रह्मांड में आयात करने के लिए XMLCorpusReader का उपयोग करें।

1

मुझे एक्सएमएल दस्तावेज़ों के लिए विशिष्ट नियम लिखना पड़ा जो मैं विश्लेषण कर रहा था।

मैंने जो किया वह सेगमेंट में एचटीएमएल टैग का मानचित्रण करना था। यह मानचित्रण कई दस्तावेज़ों/पृष्ठों का अध्ययन करने और एचटीएमएल टैग का प्रतिनिधित्व करने पर आधारित था। पूर्व। < एच 1 > एक वाक्यांश खंड है; < ली > पैराग्राफ हैं; < टीडी > टोकन

यदि आप एक्सएमएल के साथ काम करना चाहते हैं, तो आप टैग के रूप में नए मैपिंग का प्रतिनिधित्व कर सकते हैं। पूर्व। < एच 1 > से < वाक्यांश >; < ली > से < अनुच्छेद >; < टीडी > < को टोकन >

आप सादे पाठ पर काम करना चाहते हैं, तो आप वर्ण का एक सेट के रूप में मैपिंग का प्रतिनिधित्व कर सकते हैं (उदा। [PHRASESTART] [PHRASEEND]), बस पीओएस या EOS लेबलिंग की तरह।

0

आप python-goose जैसे टूल का उपयोग कर सकते हैं जिसका लक्ष्य HTML पृष्ठों से आलेख निकालने का लक्ष्य है।

from html5lib import parse 


with open('page.html') as f: 
    doc = parse(f.read(), treebuilder='lxml', namespaceHTMLElements=False) 

html = doc.getroot() 
body = html.xpath('//body')[0] 


def sanitize(element): 
    """Retrieve all the text contained in an element as a single line of 
    text. This must be executed only on blocks that have only inlines 
    as children 
    """ 
    # join all the strings and remove \n 
    out = ' '.join(element.itertext()).replace('\n', ' ') 
    # replace multiple space with a single space 
    out = ' '.join(out.split()) 
    return out 


def parse(element): 
    # those elements can contain other block inside them 
    if element.tag in ['div', 'li', 'a', 'body', 'ul']: 
     if element.text is None or element.text.isspace(): 
      for child in element.getchildren(): 
       yield from parse(child) 
     else: 
      yield sanitize(element) 
    # those elements are "guaranteed" to contains only inlines 
    elif element.tag in ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6']: 
     yield sanitize(element) 
    else: 
     try: 
      print('> ignored', element.tag) 
     except: 
      pass 


for e in filter(lambda x: len(x) > 80, parse(body)): 
    print(e) 
0

alexis के रूप में उत्तर दिया, python-goose एक अच्छा विकल्प हो सकता है:

अन्यथा मैं निम्नलिखित छोटे प्रोग्राम है जो अच्छे परिणाम की तरह देता है बनाया है।

HTML Sentence Tokenizer भी है, एक (नई) लाइब्रेरी जिसका उद्देश्य इस सटीक मुद्दे को हल करना है। इसका वाक्यविन्यास बहुत आसान है। एक पंक्ति में, parsed_sentences = HTMLSentenceTokenizer().feed(example_html_one), आप सरणी parsed_sentences में संग्रहीत एक HTML पृष्ठ में वाक्यों को प्राप्त कर सकते हैं।

संबंधित मुद्दे