91953


xmlファイルから一定の場所のテキストの内容を抽出し、テキストファイルに格納し,csvファイルとテキストファイルの中の全文との共起語を抽出し、その共起語の数と付与されているidを出力させるプログラムを作成したい.

[code]

    実行結果　例)
    (共通している用語　　　　共通している用語の個数  用語に付与されているid)
    
        acute                        2                   0000
        distress                     1                   0000
        coronavirus                  1                   1111
        China                        2                   1111
    
    (付与されているid     そのidの個数)
          0000                3
          1111                3
    
[/code]

ソースコード

[code]

    from bs4 import BeautifulSoup
    import csv
    
    #xmlファイル読み込み
    with open('ab36_37.xml','r',encoding='utf-8') as xml:      
        soup = BeautifulSoup(xml, 'xml')
    
    #passageの中のparagraphのテキストのCOVID-19とSARS-CoV-2の文字列を抽出
    
    texts = soup.select('''
    passage >
      infon[key="type"]:-soup-contains("paragraph") ~ text:-soup-contains("SARS-CoV-2")
    ''')
    text = [t.text for t in texts]
    xml.close()
    
    #実行結果を指定のファイルに保存
    with open ('re_ab3637.txt','w')as txt:
      print('\n'.join(text),file=txt)
    txt.close
    
[/code]

csvファイル 例

[code]

    0000,acute
    0000,distress
    1111,coronavirus
    1111,China
    
[/code]

テキストファイル 例

[code]

    Severe acute respiratory distress syndrome due to acute coronavirus (SARS-CoV-2), which was first diagnosed in China, China in December 2019.
    
[/code]


CC BY-SA 4.0
2022-11-02T11:41:23.637
91951
2022-11-02T13:12:28.180
2022-11-02T12:41:39.737
54656
54656
question
python python3
xmlファイルの操作


ただCSVにでてくる単語をサンプルテキストから数えるだけってことですよね？  
共起っていう表現を使うから難しくきこえるだけで  
文字列から文字列の出現頻度を数えるメソッドがあるので結構簡単にできます  
<https://hibiki-press.tech/python/count/103>

ファイル名は適宜変更してください

[code]

    def main():
        # IDと単語のかかれたCSVを１行ずつ配列にする
        with open('words.csv','r') as f:
            rows = f.readlines()
    
        # 探す文章をまるごと１つの文字列に入れる
        with open('re_ab3637.txt','r') as f:
            text = f.read()
    
        # id => count へのマップ
        id_count = {}
    
        with open('result1.csv','w') as f:
            for row in rows:
                # id,word という文字列を , で分割
                tmp = row.split(',')
                id = tmp[0]
                # 改行ついてるので取り除く
                word = tmp[1].strip()
                # text に word が何回入ってるか数える
                count = text.count(word)
                f.write('%s,%d,%s\n' % (word, count, id))
    
                # id がすでにあったらカウント追加する
                if id in id_count:
                    id_count[id] += count
                else: # なかったらエントリ作成する
                    id_count[id] = count
    
        # id => count を出力
        with open('result2.csv','w') as f:
            for id, count in id_count.items():
                f.write('%s,%d\n' % (id, count))
    
    
    if __name__ == '__main__':
        main()
    
[/code]

result1.csv

[code]

    acute,2,0000
    distress,1,0000
    coronavirus,1,1111
    China,2,1111
    
[/code]

result2.csv

[code]

    0000,3
    1111,3
    
[/code]


CC BY-SA 4.0
2022-11-02T12:49:03.117
91953
2022-11-02T13:12:28.180
2022-11-02T13:12:28.180
91951
answer