2014-11-11 2 views
1

약어 사전에서 'rna'와 'ribonucleic acid'와 같은 단어를 대체하려고합니다. 다음 글을 써 보았지만 약어를 대체하지는 않습니다.Python을 사용하여 사전에서 약어로 바꾸기

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'를해야
rna,ribonucleic acid 
rnd,radical neck dissection 
rni,recommended nutrient intake 
rnp,ribonucleoprotein 

+0

당신이' 'rna'' 또는''RNA''를 교체하려고합니까? 그것들은 다른 문자열입니까? – abarnert

+1

또한 실행 및 디버그 할 수있는 _complete_ - 2 행의'trial.csv' 및'line'' Dictionary.csv' (또는 코드의 하드 코드 된 값)를 제공해주십시오. 도움말에서 [MCVE] (http://stackoverflow.com/help/mcve)를 참조하십시오. – abarnert

+0

@abarnert 'RNA'를 대체하려하지만 'rna'가 있습니다. 이 사건을 무시할 수있는 방법이 있습니까? 또한, 'corna'를 대체하기를 원하지 않습니다. (나는 그러한 단어가 존재하지 않는다는 것을 알고 있습니다. 그러나 그것이 일어나지 않도록 확실히하고 싶습니다.) 'coribonucleic acid'. – abn

답변

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) 
+0

이것은 _a_ 문제이지만 그녀가 묻는 문제는 아닙니다. 그녀는 그녀가 물었던 것을 해결할 때까지 이걸 갖지 않을 것입니다. – abarnert

+0

@abarnert, 내 솔루션은 확장과 약어를 대체합니다 - 이것이 그녀가 원하는 것입니다. – vikramls

+0

감사합니다. 그것은 효과가 있었다. 오직'mydict.get (word, word)'를'mydict.get (word.lower(), word)'로 대체해야만했다. 'lower()'는 사전이 소문자이기 때문에 제대로 작동했고 casefold() 작업을하지 않을 수있었습니다. – abn

1

'RNA'를 바꾸려고하는데 'rna'가 있습니다. 이 사건을 무시할 수있는 방법이 있습니까?

확실히. 값을 찾는 동안 그냥 다시 사전을 만드는 동안 각 키에 casefold를 호출 : 당신이 casefold (IIRC이없는 파이썬의 이전 버전을 사용하는 경우

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

# ... 

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

을, 그것은 2.7에 첨가하고 3.2이지만 그보다 늦을 수도 있습니다 ...) 대신 lower을 사용하십시오. 영어 이외의 문자 (예 : 'ß'.casefold()'ss'이고, 'ß'.lower()'ß')는 항상 올바른 것은 아닙니다.하지만 애플리케이션에서는 문제가없는 것처럼 보입니다. (그렇지 않은 경우 unicodedata 더 복잡한 무언가를 쓰기, 또는 제 3 자 라이브러리를 찾을 중 하나가 있습니다.)


을 또한, 나는 내가 아는 (이 'corna'를 대체하고 싶지 않아 그런 단어는 존재하지 않지만 그것이 일어나지 않도록하고 싶다.) 'coribonucleic acid'.

글쎄, 당신은 이미 "단어가 아닌"문자들로 나뉘는 re.split을 사용하고 있습니다. 그런 다음 각 결과 단어를 구분하여 찾습니다. corna은 dict에 포함되지 않으므로 대체되지 않습니다. (re의 "단어"문자 개념은 실제로는 원하는 단어가 아니며 밑줄과 숫자가 단어의 일부로 포함되므로 rna2dna은 일치하지 않으며 s1$_2(rNa/과 같은 이진 데이터 청크가 일치 할 수 있습니다. readlinesss이 라인의 목록이 될 것입니다 것을 의미 호출

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

:


은 또한 코드에서 또 다른 심각한 문제를 가지고있다. 이 목록에 str을 호출하면 s이 큰 문자열이되고 그 다음에 쉼표로 구분 된 각 줄 (주위의 따옴표, 백 슬래시 이스케이프 등)을 다시 작성한 다음 ]이라는 큰 문자열이됩니다. 당신은 거의 그것을 원하지 않을 것입니다. 전체 파일을있는 그대로 문자열로 읽으려면 read()을 사용하십시오.

rna,ibonucleic acid 

당신이 ibonucleic acidrna를 교체하는 경우 등, 일부는 읽기 어려운 할거야 :


는 그리고 당신도, 당신의 데이터에 문제가있는 표시 산출. 이것이 실제로 사전 형식이고 사전 사용자가 일부 논리를 추측한다고 가정하면 (예 : 첫 번째 문자가 약어에서 복사되는 경우), 논리를 작성해야합니다. 예를 들어 :

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)) 

마지막으로, 문자열 리터럴에서 이스케이프 백 슬래시를 사용하는 것은 좋은 생각입니다. 이 경우에는 파이썬이 \W에 대한 의미를 가지지 않기 때문에 빠져 나갈 수 있지만 항상 그렇지는 않습니다. 이 문제를 해결하는 가장 좋은 방법은 r'(\W+)'과 같은 원시 문자열 리터럴을 사용하는 것입니다.

+0

감사합니다. 나는 편집을 시도했다. read(), casefold 및 s를 사용하면''str '객체에'casefold '속성이 없습니다. readlines()를 사용하면 casefold와 s는'expect string or buffer'를 얻게됩니다. – abn

+0

그것은 제 실수였습니다. 나는 그것을 올바르게 카피하지 않았다. 그것은 리보 핵산입니다. – abn

+0

이전 버전의 파이썬에서는'casefold'가 존재하지 않습니다. 'lower'를 사용하십시오. 그렇지 않으면 같은 생각. – abarnert

관련 문제