我有一组标签,我试图从XML文本中提取并确定它们在“渲染”文本中的位置。
例如:
XML:
<p>The risk of sexual transmission of HIV-1 correlates strongly with plasma HIV-1 level.
<xref ref-type="bibr" rid="pone.0012598-Fideli1">[1]</xref>,
<xref ref-type="bibr" rid="pone.0012598-Quinn1">[2]</xref>This association has motivated proposed interventions (such as use of antiretroviral therapy (ART),
<xref ref-type="bibr" rid="pone.0012598-Cohen1">[3]</xref>,
<xref ref-type="bibr" rid="pone.0012598-Granich1">[4]</xref> therapeutic HIV-1 vaccines,<xref ref-type="bibr" rid="pone.0012598-Gurunathan1">[5]</xref> and treatment for co-infections<xref ref-type="bibr" rid="pone.0012598-Corey1">[6]</xref>–<xref ref-type="bibr" rid="pone.0012598-Walson1">[8]</xref> that reduce HIV-1 infectiousness by reducing levels of plasma HIV-1 RNA.
渲染:
HIV-1性传播的风险与血浆HIV-1水平密切相关[1],[2]这种关联推动了拟议的干预措施(如使用抗逆转录病毒疗法(ART) ),[3],[4]治疗性HIV-1疫苗,[5]和共感染治疗[6] - [8]通过降低血浆HIV-1 RNA水平降低HIV-1感染性。
为了在渲染文本中提取标签及其位置。目前我正在使用bs4
,类似于此代码的内容(sent_tokenize
来自NLTK工具箱,并根据输入文本创建list
个句子:
for n, p in enumerate(article.find_all('p')):
rawtext = str(p) #returns the XML version of the text
readtext = p.text #returns the rendered version
sents = sent_tokenize(readtext) #splits sentences
for ref in p.find_all('xref'):
startloc = rawtext.find(str(ref))
prestart = max(0, startloc-20)
for s in sents:
if s.find(rawtext[prestart:startloc]) > -1:
print s, ref
break
此代码无法在第二个外部参照上找到,因为它之前的文本是前一个外部参照标记的一部分。
有什么建议吗?
答案 0 :(得分:1)
嗯,没有人回应所以我不得不即兴发挥。这是我目前的方法:
lens = [len(tag.string) for tag in p.contents]
clens = [sum(lens[:ind]) for ind in xrange(1,len(lens))]
locs = [spot for tag, spot in zip(p.contents, clens) if isinstance(tag, Tag) and tag.name == 'xref']
基本思想是使用返回渲染文本的string
方法。我用它来确定段落中每个孩子的长度。然后我使用这些长度来确定我正在寻找的标签的位置。
希望能帮到别人!
- 将会