2013-01-19 1 views
1

텍스트 파일에서 선을 읽고 단어 사이의 Wu-Palmer 거리를 기반으로 거리 매트릭스를 작성하고 싶습니다. 예 :python을 사용하여 동일한 열과 행 표제를 사용하는 방법은 무엇입니까?

  House Grass Boat Cat 
House  x  y  .. .. 
Grass  x1  y1  .. .. 
Boat  x2  y2  .. .. 
Cat   x3  y3  .. .. 
나는 기존의 기능을 내가 텍스트 파일 출력에서의 거리 행렬의 행과 열로 라인을 라인을 읽을 파이썬에서 사용할 수있는이 있는지 알고 싶습니다

? 귀하의 의견은 단순히 공백으로 구분 된 단어 인 경우

+0

입력 형식은 무엇입니까? – Abhijit

+0

입력은 단어 목록이있는 텍스트 파일입니다 (예 : 집, 잔디, 보트, 고양이 등). – user1992696

답변

1

당신은 쉽게처럼 반복 할 수 있습니다

words = set() 
with open("input.txt", "r") as fd: 
    for line in fd: 
     words.update(line.split()) 

set의 사용은 각 단어는 오직 한 번 기록되도록합니다 - 그것은 같은 소리입니다 니가 뭘했는지.

입력 내용이 영어 텍스트를 실행하는 경우 '나'와 같은 단어를 잡으려하기 때문에 상황이 조금 더 어려워집니다. 하이픈으로 연결된 단어 (예 : '시간제')를 단일 단어로 분류할지 여부도 결정해야합니다 단어 - 여기 내 예시가 있지만 쉽게 변경할 수 있습니다. 문자의 그룹은 하나 이상의 구성된 아무것도입니다

import re 
import string 

non_word_re = re.compile(r"[^-\w']+") 
words = set() 
with open("input.txt", "r") as fd: 
    for line in fd: 
     words.update(i for i in non_word_re.split(line) if i[0] in string.letters) 

이 단어의 set을 만들 것입니다 : 내가 그들의 팬이 아니에요 많이 정규 표현식이 사실은 꽤 유용 곳이 어딘가에 [a-zA-Z0-9_-']을 설정하고 첫 번째 문자는 문자입니다.

all_distances = {} 
for word in words: 
    all_distances[word] = dict((i, calculate_distance(word, i)) for i in words) 

아마 여기에 중첩 된 사전보다 청소기 데이터 구조있어,하지만 난 그 충분할 것이라고 생각만큼 간단합니다

이 후, 당신은 쉽게 단어의 각 쌍 사이의 거리를 계산할 수 있습니다.

마지막으로, 출력 할 수 있습니다 같은 탭으로 구분 된 매트릭스 뭔가 :

with open("output.txt", "w") as fd: 
    fd.write("\t" + "\t".join(sorted(all_distances.keys())) + "\n") 
    for word1, distances in sorted(all_distances.iteritems()): 
     fd.write(word1 + "\t" + "\t".join(i[1] for i in sorted(distances.iteritems()))) 

yuo 원하는 경우 매우 형식의 출력 매트릭스에 가까운 뭔가 (즉, 각 열은 자동으로 그 내용에 따라 크기가된다) 그렇다면 여전히 하드가 아니지만 약간의 실수로 코드가 더 필요합니다.

CSV 형식으로 파일을 읽거나 쓰고 싶다면 Python csv 모듈을 살펴보고 따옴표와 같은 지저분한 작업을 처리하십시오.

그게 너 일종의거야?