亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 Python 標記和標記 HTML 源代碼

使用 Python 標記和標記 HTML 源代碼

慕妹3146593 2022-01-18 17:09:48
我有一些帶注釋的 HTML 源代碼,其中代碼類似于您將使用的代碼,requests并且注釋是帶有標記項目開始的字符索引的標簽,并且例如,源代碼可以是:<body><text>Hello world!</text><text>This is my code. And this is a number 42</text></body>標簽可以是例如:[{'label':'salutation', 'start':12, 'end':25}, {'label':'verb', 'start':42, 'end':45}, {'label':'size', 'start':75, 'end':78}]分別指“Hello world”、“is”和“42”這三個詞。我們事先知道標簽沒有重疊。我想處理源代碼和注釋以生成適合 HTML 格式的標記列表。例如,它可以在這里產生如下內容:['<body>', '<text>', 'hello', 'world', '</text>', '<text>', 'this', 'is', 'my', 'code', 'and', 'this', 'is', 'a', 'number', '[NUMBER]', '</text>', '</body>']此外,它必須將注釋映射到標記化,生成與標記化長度相同的標簽序列,例如:['NONE', 'NONE', 'salutation', 'salutation', 'NONE', 'NONE', 'NONE', 'verb', 'NONE', 'NONE', 'NONE', 'NONE', 'NONE', 'NONE', 'NONE', 'size', 'NONE', 'NONE']在 Python 中完成此任務的最簡單方法是什么?
查看完整描述

2 回答

?
UYOU

TA貢獻1878條經驗 獲得超4個贊

您可以使用遞歸BeautifulSoup來生成所有標簽和內容的列表,然后可以使用它來匹配標簽:


from bs4 import BeautifulSoup as soup

import re

content = '<body><text>Hello world!</text><text>This is my code. And this is a number 42</text></body>'

def tokenize(d):

  yield f'<{d.name}>'

  for i in d.contents:

     if not isinstance(i, str):

       yield from tokenize(i)

     else:

       yield from i.split()

  yield f'</{d.name}>'


data = list(tokenize(soup(content, 'html.parser').body))

輸出:


['<body>', '<text>', 'Hello', 'world!', '</text>', '<text>', 'This', 'is', 'my', 'code.', 'And', 'this', 'is', 'a', 'number', '42', '</text>', '</body>']

然后,匹配標簽:


labels = [{'label':'salutation', 'start':12, 'end':25}, {'label':'verb', 'start':42, 'end':45}, {'label':'size', 'start':75, 'end':78}] 

tokens = [{**i, 'word':content[i['start']:i['end']-1].split()} for i in labels]

indices = {i:iter([[c, c+len(i)+1] for c in range(len(content)) if re.findall('^\W'+i, content[c-1:])]) for i in data}  

new_data = [[i, next(indices[i], None)] for i in data]

result = [(lambda x:'NONE' if not x else x[0])([c['label'] for c in tokens if b and c['start'] <= b[0] and b[-1] <= c['end']]) for a, b in new_data]

輸出:


['NONE', 'NONE', 'salutation', 'salutation', 'NONE', 'NONE', 'NONE', 'verb', 'NONE', 'NONE', 'NONE', 'NONE', 'NONE', 'NONE', 'NONE', 'size', 'NONE', 'NONE']

查看完整回答
反對 回復 2022-01-18
?
胡說叔叔

TA貢獻1804條經驗 獲得超8個贊

目前我已經使用 HTMLParser 完成了這項工作:


from html.parser import HTMLParser

from tensorflow.keras.preprocessing.text import text_to_word_sequence


class HTML_tokenizer_labeller(HTMLParser):

  def __init__(self, annotations, *args, **kwargs):

    super(HTML_tokenizer_labeller, self).__init__(*args, **kwargs)

    self.tokens = []

    self.labels = []

    self.annotations = annotations


  def handle_starttag(self, tag, attrs):

    self.tokens.append(f'<{tag}>')

    self.labels.append('OTHER')


  def handle_endtag(self, tag):

    self.tokens.append(f'</{tag}>')

    self.labels.append('OTHER')


  def handle_data(self, data):

    print(f"getpos = {self.getpos()}")

    tokens = text_to_word_sequence(data)


    pos = self.getpos()[1]

    for annotation in annotations:

      if annotation['start'] <= pos <= annotation['end']:

        label = annotation['tag']

        break

    else: label = 'OTHER'


    self.tokens += tokens

    self.labels += [label] * len(tokens)


查看完整回答
反對 回復 2022-01-18
  • 2 回答
  • 0 關注
  • 151 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號