首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将HTML解析成句子--如何处理表/列表/标题/等等?

将HTML解析成句子--如何处理表/列表/标题/等等?
EN

Stack Overflow用户
提问于 2012-06-30 20:20:04
回答 5查看 3K关注 0票数 8

如何将包含自由文本、列表、表格、标题等的HTML页面解析成句子?

这个维基百科页面为例。有/正在:

  • 免费文本:http://en.wikipedia.org/wiki/Neurotransmitter#Discovery
  • 列表:http://en.wikipedia.org/wiki/Neurotransmitter#Actions
  • 表:神经递质

在使用python NLTK之后,我想测试所有这些不同的语料库注释方法(来自http://nltk.googlecode.com/svn/trunk/doc/book/ch11.html#deciding-which-layers-of-annotation-to-include):

  • 单词令牌化:文本的正字法形式不明确地标识它的标记。除了传统的正字法版本之外,令牌化和规范化版本可能是一个非常方便的资源。
  • 句子切分:正如我们在第三章中看到的,句子切分可能比看起来更困难。因此,一些语料库使用显式注释来标记句子切分。
  • 段落分段:段落和其他结构元素(标题、章节等)可能被显式注释。
  • 词类:文档中每个单词的句法类别。
  • 句法结构:表示句子组成结构的树状结构。
  • 浅语义:命名实体和共同引用注释,语义角色标签。
  • 对话与语篇:对话行为标记与修辞结构

一旦你把一份文件分解成句子,它看起来就很简单了。但是,如何从维基百科页面中分解类似HTML的内容呢?我非常熟悉使用HTML/XML解析器和遍历树,并且我尝试过剥离HTML标记来获取纯文本,但是由于在HTML被删除后缺少标点符号,NLTK不能正确地解析表单元格,甚至列表。

用NLP解析这些东西有什么最佳实践或策略吗?还是只需要手动编写一个特定于该页的解析器?

只是在寻找一些正确的方向上的指针,真的想尝试这个NLTK!

EN

回答 5

Stack Overflow用户

发布于 2012-07-01 16:33:01

听起来,您正在剥离所有HTML并生成一个平面文档,这会使解析器感到困惑,因为松散的部分被粘住在一起。由于您对XML有经验,我建议将您的输入映射到一个简单的XML结构中,该结构使各个部分保持独立。你可以让它变得简单如你所愿,但也许你想保留一些信息。例如,标记标题、节标题等可能是有用的。当您有了一个将块分开的可行的XML树时,请使用XMLCorpusReader将其导入到NLTK中。

票数 1
EN

Stack Overflow用户

发布于 2013-12-06 23:44:28

我必须编写特定于我正在分析的XML文档的规则。

我所做的就是将html标记映射到段。此映射是基于研究几个文档/页面并确定html标记所代表的内容。例如。是短语段;是段落;是标记

如果您想使用XML,可以将新的映射表示为标记。例如。给;给;给

如果要处理纯文本,可以将映射表示为一组字符(例如。PHRASESTART),就像POS或EOS标记一样。

票数 1
EN

Stack Overflow用户

发布于 2016-11-10 20:38:56

您可以使用像巨蟒鹅这样的工具,它旨在从html页面中提取文章。

否则,我做了以下小程序,取得了很好的效果:

代码语言:javascript
复制
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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11277379

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档