1

略語の辞書から「rna」のような単語を「リボ核酸」に置き換えようとしています。次のように書いてみましたが、略語を置き換えません。

import csv,re
outfile = open ("Dict.txt", "w")
with open('Dictionary.csv', mode='r') as infile:
    reader = csv.reader(infile)
    mydict = {rows[0]:rows[1] for rows in reader}
    print >> outfile, mydict
out = open ("out.txt", "w")
ss = open ("trial.csv", "r").readlines()
s = str(ss)
def process(s):
    da = ''.join( mydict.get( word, word ) for word in re.split( '(\W+)', s ) )
    print >> out, da
process(s)

サンプルの trial.csv ファイルは次のようになります。

A,B,C,D
RNA,lung cancer,15,biotin
RNA,lung cancer,15,biotin
RNA,breast cancer,15,biotin
RNA,breast cancer,15,biotin
RNA,lung cancer,15,biotin

Dictionary.csv の例:

rna,ribonucleic acid
rnd,radical neck dissection
rni,recommended nutrient intake
rnp,ribonucleoprotein

出力ファイルの「RNA」が「リボ核酸」に置き換えられている必要があります

4

2 に答える 2

1

「RNA」を置き換えようとしていますが、私の辞書には「rna」があります。ケースを無視できる方法はありますか。

もちろん。casefoldディクショナリの作成中に各キーを呼び出すだけで、値を検索するときにもう一度呼び出すことができます。

mydict = {rows[0].casefold(): rows[1] for rows in reader}

# ...

da = ''.join( mydict.get(word.casefold(), word) for word in re.split( '(\W+)', s ) )

古いバージョンの Python を使用している場合casefold(IIRC、2.7 と 3.2 で追加されましたが、それよりも後だった可能性があります…)、lower代わりに使用してください。'ß'.casefold()英語以外の文字 ( is 'ss'、 while 'ß'.lower()isなど)に対して常に正しいことをするとは限りませんが'ß'、アプリケーションでは問題ないようです。(そうでない場合は、より複雑なものを で作成するかunicodedata、サードパーティのライブラリを見つける必要があります。)


また、「corna」(そのような言葉が存在しないことは知っていますが、そうならないようにしたい)を「coribonucleic acid」に置き換えたくありません。

re.splitこれは、「単語以外の」文字で分割されます。次に、結果の各単語を個別に調べます。辞書にないためcorna、置き換えられません。(ただし、reの「単語」文字の概念は、実際には必要なものではない場合があります。単語の一部としてアンダースコアと数字が含まれているため、rna2dna一致しませんが、バイナリ データのチャンクはs1$_2(rNa/可能性があります。)


コードには別の深刻な問題もあります。

ss = open ("trial.csv", "r").readlines()
s = str(ss)

呼び出しは、それが行のリストになることをreadlines意味します。そのリストをss呼び出すと、 、次に各行の表現 (引用符で囲んだり、バックスラッシュでエスケープしたりなど) をコンマで区切り、次に.を含む大きな文字列になることを意味します。あなたはほぼ確実にそれを望んでいません。ファイル全体をそのまま文字列に読み込みたい場合にのみ使用してください。strs[]read()


また、データにも問題があるようです:

rna,ibonucleic acid

などに置き換えるrnaibonucleic acid、読みにくい出力が得られます。これが実際の辞書形式であり、辞書のユーザーが何らかのロジック (たとえば、最初の文字が略語からコピーされるなど) を推測する必要がある場合は、そのロジックを作成する必要があります。例えば:

def lookup(word):
    try:
        return word[0] + mydict[word.casefold()]
    except KeyError:
        return word
da = ''.join(lookup(word) for word in re.split('(\W+), s))

最後に、文字列リテラルでエスケープされていないバックスラッシュを使用することはお勧めできません。この場合、Python は\W. これを回避する最善の方法は、 のような生の文字列リテラルを使用することr'(\W+)'です。

于 2014-11-11T01:41:09.287 に答える
0

s = str(ss)この行が問題を引き起こしていると思います-作成されたリストが文字列になりました!

代わりにこれを試してください:

def process(ss):
    for line in ss:
        da = ''.join( mydict.get( word, word ) for word in re.split( '(\W+)', line ) )
        print >> out, da

process(ss)
于 2014-11-11T01:42:07.373 に答える