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,或者找到第三方库。)


另外,我不希望它用“coribonucleic acid”替换“corna”(我知道这样的词不存在,但我想确保它不会发生)。

好吧,你已经用你的re.split,它在任何“非单词”字符上分割;然后,您分别查找每个结果单词。由于corna不会在字典中,因此不会被替换。(尽管请注意,re“单词”字符的概念实际上可能不是您想要的——它包括下划线和数字作为单词的一部分,因此rna2dna不会匹配,而像s1$_2(rNa/可能这样的二进制数据块。)


您的代码中还有另一个严重的问题:

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

调用readlines意味着这ss将是一个行列表。调用str该列表意味着这s将是一个大字符串[,然后是每行的 repr(用引号引起来,反斜杠在其中转义等),用逗号分隔,然后]. 你几乎肯定不想那样。如果您想按原样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 回答