2013-10-17 2 views
0

많은 파일을 두 번 반복해야하는데, 은 파일 전체에서 단어 쌍의 모양을 계산합니다. Python : 파일 반복을 통한 빠른 반복

을 (피셔의 정확한 시험 점수를 계산하는 두 단어의 비상 테이블을 구축하기 위해) 나는 현재이 나쁜 것은 아니지만, 내가 어떤 빠른 방법이 있는지 알고 싶어

from itertools import izip 
src=tuple(open('src.txt','r')) 
tgt=tuple(open('tgt.txt','r')) 
w1count=0 
w2count=0 
w1='someword' 
w2='anotherword' 
for x,y in izip(src,tgt): 
    if w1 in x: 
     w1count+=1 
    if w2 in y: 
     w2count+=1 
    ..... 

을 사용하고 있습니다 두 파일을 반복 할 수 있기를 바랍니다.

미리 도움을 주셔서 감사합니다. 일반적으로

+1

자세한 정보를 제공해야합니다. 특정 문제를 명확히하거나 추가 세부 정보를 추가하여 필요한 것을 정확히 강조하십시오. 현재 작성된 내용이므로 귀하가 원하는 내용을 정확하게 말하기는 어렵습니다. –

+0

@InbarRose 추가 정보를 추가했습니다. 아직 충분하지 않다면 알려주세요. – ytrewq

+0

글쎄, 아직 많은 정보가 누락되었습니다. 여기에 표시하는 코드에서 사용하는 변수는 무엇입니까? 예를 들어'src','tgt','w1','w2','w1count' 및'w2count'와 같은 선언을 보여 주어야합니까? –

답변

1

정확히 무엇을 하려는지 정확히 알 수는 없지만 올바른 방향을 제시 할 수있는 몇 가지 예제 코드가 있습니다.

사전 또는 collections.Counter 인스턴스를 사용하여 파일을 통해 번 발생하는 모든 단어 및 쌍 을 계산할 수 있습니다. 그런 다음 메모리 내 데이터 만 쿼리하면됩니다.

import collections 
import itertools 
import re 

def find_words(line): 
    for match in re.finditer("\w+", line): 
     yield match.group().lower() 

counts1 = collections.Counter() 
counts2 = collections.Counter() 
counts_pairs = collections.Counter() 

with open("src.txt") as f1, open("tgt.txt") as f2: 
    for line1, line2 in itertools.izip(f1, f2): 
     words1 = list(find_words(line1)) 
     words2 = list(find_words(line2)) 
     counts1.update(words1) 
     counts2.update(words2) 
     counts_pairs.update(itertools.product(words1, words2)) 

print counts1["someword"] 
print counts1["anotherword"] 
print counts_pairs["someword", "anotherword"] 
+0

soooo 많이 감사합니다 !!!!!! – ytrewq

+0

죄송합니다. 한 번만 더 질문드립니다. 이 프로그램을 실행 한 후 각 단어 또는 단어 쌍 수를 어떻게 검색합니까? – ytrewq

+0

btw 코드 수율 str (word) .lower()를 변경해야했습니다. – ytrewq

0

데이터가 가장 좋은 건이다 후 메모리에 들어갈 정도로 작은 경우 : 메모리 구조에서

  • 으로 반복 메모리에

    1. 전 공정 데이터

    파일이 크면 압축 된 데이터와 같은 데이터 구조로 사전 처리하고 pickle과 같은 형식으로 저장하면 훨씬 빠르게로드 할 수 있습니다. &은 별도의 파일로 작업 한 후 처리합니다.

  • +0

    내 파일은 각각 37MB 및 36MB입니다. 그것은 메모리에 맞게 충분히 작습니까? – ytrewq

    +0

    @CosmicRabbitMediaInc : 거의 확실합니다. 하지만 알고리즘을 변경하는 것이 올바른 접근 방법이라고 생각합니다. –

    +0

    @SvenMarnach 고맙습니다. 어떤 조언을 알고리즘을 변경하는 방법에 관해서는? – ytrewq

    0

    해결 방안 : 파일을 팬더 데이터 프레임으로 만들려고 했습니까? 나는. 나는 당신이 이미 입력에서 단어 목록을 만든다고 가정합니다. (예 :.와 같은 읽기 기호를 제거하고) input.split ('') 또는 유사한 것을 사용합니다. 그런 다음 DataFrames로 만들고, 워드 카운트를 수행 한 다음 데카르트 조인을 만들 수 있습니까?

    import pandas as pd 
    df_1 = pd.DataFrame(src, columns=['word_1']) 
    df_1['count_1'] = 1 
    df_1 = df_1.groupby(['word_1']).sum() 
    df_1 = df_1.reset_index() 
    
    df_2 = pd.DataFrame(trg, columns=['word_2']) 
    df_2['count_2'] = 1 
    df_2 = df_2.groupby(['word_2']).sum() 
    df_2 = df_2.reset_index() 
    
    df_1['link'] = 1 
    df_2['link'] = 1 
    
    result_df = pd.merge(left=df_1, right=df_2, left_on='link', right_on='link') 
    del result_df['link'] 
    

    바구니 분석을 위해이 물건을 사용하면 정말 잘 작동합니다.

    관련 문제