2015-01-09 6 views
0
내가이 개 매개 변수를 수신 ( 이름, 목록) HASHcount라는 기능의 이름 하나를 쓰고 있어요

을 분석해 될 파일이 같은 구조 텍스트 파일의 이름입니다 :는 계수 해시 태그

Date|||Time|||Username|||Follower|||Text 

기본적으로 입력은 위와 같이 구조화 된 여러 행이있는 짹짹 목록입니다. 목록 매개 변수는 해당 텍스트 파일에서 계산할 해시 태그 목록입니다. 주어진 목록의 각 단어가 짹짹 목록에서 몇 번이나 발생했는지 확인하고, 단어가없는 경우에도 각 단어 수가 포함 된 사전을 출력으로 제공하기를 원합니다. 예를 들어

, 지시 HASHcount와 (12월, [평화, 사랑]) 프로그램이 출력으로 얼마나 많은 시간을 단어 평화와 사랑 단어를 확인하여 만든 사전을 제공한다은 해시 태그로 사용되어왔다 12 월이라는 파일의 각 트윗의 텍스트 필드에

또한 사전에 해시 태그가없는 단어가 있어야합니다. 나는이 기능을 만들기에 붙어

, 나는이 점에있어하지만 사전에 관한 몇 가지 문제가 있어요 :

def HASHcount(name,list): 
f = open(name,"r") 
dic={} 
l = f.readline() 
for word in list: 
    dic[word]=0 
    for line in f: 
    li_lis=line.split("|||") 
    li_tuple=tuple(li_lis) 
    if word in li_tuple[4]: 
     dic[word]=dic[word]+1 
return dic 
+0

나를 유치원이라 부르지 만, '분석 된'맞춤법 오류로 나를 웃게했습니다. – Gerrat

+1

입력 파일의 예를 게시 할 수 있습니까? 죄송합니다 지금보십시오 –

+1

이것은 정규식에 대한 좋은 직업입니다. 또한 예약어이기 때문에 "list"를 Python의 변수 이름으로 사용하지 마십시오. – dylrei

답변

1

다른 사람 (예 : 트윗의 텍스트에서 해시 태그의 식별에 관한 동안 이미 지적 된 일부 코드와 몇 가지 문제가있다)하지 않았습니다. 이 사실에 키가 몇 단순화를 제공

def HASHcount(name, words): 
    dic = dict.fromkeys(words, 0) 
    with open(name,"r") as f: 
     for line in f: 
      for w in words: 
       if '#' + w in line: 
        dic[w] += 1 
    return dic 

트윗에 해시 태그가 (당신이 dic에서 원하지 않는 # 시작 않도록 다음은 후자의 문제의 좋은 점을 포함하지 않는 부분 솔루션입니다) 결과적으로 텍스트를 제외하고는 #이 존재할 수 없기 때문에 각 행을 분석 할 가치가 없습니다. 그러나

, 그것은 여전히 ​​다른 답변에서 본 문제의 일부가 (단지 부분이 가장 민감한을 주석 처리를 제외한를 -!) -이 부분 일치에 의해 잘못된 반응을 얻을 수 있습니다. 수표가 word in linetext 인 경우 문제가 커집니다. 예를 들어 단어가 cat 인 경우 완벽하게 일반 텍스트 (자체 또는 다른 단어의 일부로, 예 : vindicative)에 있어도 해시 태그로 계산됩니다. '#' + 접근 방식을 사용하면 조금 나아졌지만 접두사 일치는 거짓 긍정으로 이어집니다. 예를 들어 #catalogcat의 적중 횟수로 잘못 계산됩니다.

몇 가지 제안으로서 정규 표현식이 도움이 될 수 있습니다. 그러나 여기에 for w in words 루프의 본문에 대한 대안이 있습니다 ...유일한 문제는 남아

for w in words: 
     where = line.find('#' + w) 
     if where == -1: continue 
     after = line[where + len(w) + 1] 
     if after in chars_acceptable_in_hashes: continue 
     dic[w] += 1 

문자, 즉 해시 태그의 일부, 세트 chars_acceptable_in_hashes 될 수있는 결정하는 것입니다 - 나는 아무 렇게 그것을 알고하지 않도록 트위터의 사양을 기억하지만,하지를 반드시 찾을 수 있습니다 아웃. line이 아니기 때문에이 벗겨 지므로 \n으로 끝나는 것으로 알려져 있으므로 줄 끝 부분에서도 작동합니다. 허용되는 집합에 포함되지 않습니다 (따라서 행의 끝에있는 해시 태그도 "적절하게 종료됩니다").

+0

이것은 꽤 잘 작동하는 것 같습니다! 또한 받아 들일 수있는 문자들에 대한 설명을 고맙게 생각합니다. 정말 고마워요! – Chester

2

주요 문제는 당신이에서 라인 반복된다는 점이다 각 단어에 대한 파일이 아닌 그 반대로. 따라서 첫 번째 단어는 파일의 모든 행을 소비하고 이후의 각 단어는 0 개의 일치를 갖게됩니다.

대신, 당신은 같이해야합니다 :

def hash_count(name, words): 
    dic = {word:0 for word in words} 
    with open(name) as f: 
     for line in f: 
      line_text = line.split('|||')[4] 
      for word in words: 
       # Check if word appears as a hashtag in line_text 
       # If so, increment the count for word 
    return dic 
0

나는 collections 모듈을 사용하는 것을 좋아합니다. 이것은 나를 위해 일했다.

from collections import defaultdict 

    def HASHcount(file_to_open, lst): 

     with open(file_to_open) as my_file: 
      my_dict= defaultdict(int) 


      for line in my_file: 

       line = line.split('|||') 
       txt = line[4].strip(" ") 
       if txt in lst: 
        my_dict[txt] += 1 

     return my_dict 
+0

이것은 전체 트윗이 어느 단어와도 같은지 확인하고, 텍스트 *에 해당 단어가 포함되어 있는지 확인해야합니다. – augurar

+0

나는 그가 단지 # 사람을 찾고 있다고 생각했다. 본문에 나오는 사람들의 단어 수가 전부는 아닙니다. –