1

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>–&lt;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 レベルと強く相関しています。 HIV-1ワクチン[5]、および同時感染の治療[6]–[8]は、血漿HIV-1 RNAのレベルを低下させることによってHIV-1の感染性を低下させます。

レンダリングされたテキスト内のタグとその場所を引き出すため。現在、私はbs4このコードに似たものを使用しています( sent_tokenizeNLTKツールボックスからの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

直前のテキストが前の xref タグの一部であるため、このコードは 2 番目の xref で を見つけることができません。

助言がありますか?

4

1 に答える 1

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、レンダリングされたテキストを返すメソッドを使用することです。これを使用して、段落の各子の長さを決定します。次に、それらの長さを使用して、探しているタグの位置を決定します。

それが他の誰かを助けることを願っています!

-意思

于 2012-07-11T18:47:33.997 に答える