2013-12-12 4 views
3

Я делаю слово на слово анализ предложения, такого как
«Эй, это !! Это отличный фильм?»
анализ слов и оценка из файла python

У меня есть много предложений, как указано выше. У меня есть огромный файл набора данных, как показано ниже, где я должен сделать быстрый поиск, если это слово существует. Если это так, выполните анализ и сохраните в словаре, например, получите оценку из файла слова, оценку последнего слова предложения, первое слово предложения и так далее.

предложение [i] => Эй, там! Это отличный фильм ??? предложение [0] = Эй, предложение [1] = есть !! предложение [2] = Это и так далее.

Вот код:

def unigrams_nrc(file): 
    for line in file: 
     (term,score,numPos,numNeg) = re.split("\t", line.strip()) 
     if re.match(sentence[i],term.lower()): 
      #presence or absence of unigrams of a target term 
      wordanalysis["unigram"] = found 
     else: 
      found = False 
     if found: 
      wordanalysis["trail_unigram"] = found if re.match(sentence[(len(sentence)-1)],term.lower()) else not(found) 
      wordanalysis["lead_unigram"] = found if re.match(sentence[0],term.lower()) else not(found) 
      wordanalysis["nonzero_sscore"] = float(score) if (float(score) != 0) else 0    
      wordanalysis["sscore>0"] = (float(score) > 0) 
      wordanalysis["sscore"] = (float(score) != 0) 

     if re.match(tweet[len(sentence)-1],term.lower()): 
      wordanalysis["sscore !=0 last token"] = (float(score) != 0) 

Вот файл (более 4000 слов в этом файле):

#fabulous 7.526 2301 2 
#excellent 7.247 2612 3 
#superb 7.199 1660 2 
#perfection 7.099 3004 4 
#terrific 6.922 629 1 
#magnificent 6.672 490 1 
#sensational 6.529 849 2 
#heavenly 6.484 2841 7 
#ideal 6.461 3172 8 
#partytime 6.111 559 2 
#excellence 5.875 1325 6 
@thisisangel 5.858 217 1 
#wonderful 5.727 3428 18 
elegant 5.665 537 3 
#perfect 5.572 3749 23 
#fine 5.423 2389 17 
excellence 5.416 279 2 
#realestate 5.214 114 1 
bicycles 5.205 113 1 

Я хотел бы знать, если есть лучший способ сделать выше? Определение лучшего способа: быстрее, меньше кода и элегантности. Я новичок в python, поэтому я знаю, что это не лучший код. У меня есть около 4 файлов, через которые я должен пойти и проверить счет, поэтому хочу реализовать эту функцию наилучшим образом.

+0

Определить "лучший путь"? Быстрее, меньше кода, элегантности? Похоже, ваше решение достаточно хорошо написано. Я предполагаю, что это работает? –

+0

Я мог бы предложить сохранить файл как JSON, чтобы вы могли просто '' json.laods (data) '' файл данных. –

+0

@JamesMills лучший способ был бы быстрее, меньше кода и элегантности. Мое решение отлично работает, но я смотрю, есть ли лучший способ. – fscore

ответ

3

Вот мои советы:

  • Написать свой файл, как JSON с помощью json.dumps()
  • нагрузки в файле, как JSON с помощью json.laods()
  • Отдельные из вашей загрузки данных из анализа на отдельные логические блоки кода , например: функции

Python dict (s) намного быстрее для поисков с сложностью O (1), чем итерации, которая имеет O (N) - Таким образом, вы получите некоторые преимущества в производительности там до тех пор, как вы сначала загрузите файл данных.

Примеры (ы):

from json import dumps, loads 


def load_data(filename): 
    return json.loads(open(filename, "r").read()) 

def save_data(filename, data): 
    with open(filename, "w") as f: 
     f.write(dumps(data)) 

data = load_data("data.json") 

foo = data["word"] # O(1) lookup of "word" 

я бы, вероятно, хранить данные, как это:

data = { 
    "fabulous": [7.526, 2301, 2], 
    ... 
} 

Вы бы тогда сделать:

stats = data.get(word, None) 
if stats is not None: 
    score, x, y = stats 
    ... 

NB:...NOT Настоящий код и заполнители, где вы должны заполнить пробелы.

+0

можете ли вы показать мне пример ваших советов как Раньше я никогда не использовал json. – fscore

+0

диктовать лучше, чем итерация, вы имеете в виду, поместить файл в словарь и выполнить поиск, чем использовать цикл for? – fscore

+0

Обновлено. См. Выше. –

1

Возможно, загрузите файл слов/оценок один раз в память в виде диктата dicts, а затем пропустите каждое слово в каждом предложении, проверив ключи dict из вашего файла слова для каждого слова в предложении.

Would что-то вроде этой работы:

word_lookup = load_words(file) 
for s in sentences: 
    run_sentence(s) 

def load_words(file): 
    word_lookup = {} 
    for line in file: 
     (term,score,numPos,numNeg) = re.split("\t", line.strip()) 
     if not words.has_key(term): 
      words[term] = {'score': score, 'numPos': numPos, 'numNeg': numNeg} 
    return word_lookup 

def run_sentence(s): 
    s = standardize_sentence(s) # Assuming you want to strip punctuation, symbols, convert to lowercase, etc 
    words = s.split(' ') 
    first = words[0] 
    last = words[-1] 
    for word in words: 
     word_info = check_word(word) 
     if word_info: 
      # Matched word, use your scores somehow (word_info['score'], etc) 

def check_word(word): 
    if word_lookup.has_key(word): 
     return word_lookup[word] 
    else: 
     return None 
+0

Какой будет выход этого кода? и как он отличается от моего? – fscore

+0

Какова цель вывода для одного предложения? Диск, суммирующий десятки разных слов, или dict для каждого слова в предложении? Основное предложение здесь - просто сохранить ваш файл слова как большой диктофон, чтобы получить преимущества word_lookup.has_key() при проверке каждого слова в вашем предложении. –

Смежные вопросы