使用Python从字典中的缩写与更换(Replace with abbreviations from

2019-10-21 06:31发布

我试图取代像与缩略语词典“核糖核酸”“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”

Answer 1:

我觉得这条线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)


Answer 2:

我试图取代“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()'ss' ,而'ß'.lower()'ß' ),但似乎这对OK你的申请。 (如果不是的话,你必须要么编写更复杂的东西与unicodedata ,或找到一个第三方库)。


另外,我不希望它来代替“corna”(我知道有这么一个词是不存在的,但我想,以确保它不会发生)与“coribonucleic酸”。

好吧,你已经这样做,你的re.split ,其将在任何“非字”字符; 那么你查找每个最终的字separtely。 由于corna不会在快译通,它不会被取代。 (但请注意re的的‘字’字概念实际上可能不是你想要,就什么包括下划线和数字作为单词的一部分,所以rna2dna不匹配,而像二进制数据块s1$_2(rNa/力量。)


你还要在你的代码中的另一个严重的问题:

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

调用readlines意味着ss将是行的列表。 主叫str该列表上意味着s将是一个大的字符串[ ,则每一行的再版(与它周围的报价,反斜杠内它等)由逗号分隔,然后] 。 你几乎肯定不希望出现这种情况。 只要使用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+)'



文章来源: Replace with abbreviations from dictionary using Python