2014-01-09 2 views
1

Сегодня один из тех дней, когда все мои знания в программировании, кажется, терпят неудачу, и никакое количество кофе, управляемое через IV, не помогает ситуации.Сводный рекурсивный подсчет слов

Я представлен список фраз, вот некоторые, как например

"tax policies when emigrating from uk" 
"shipping to scotland from california" 
"immigrating to sweden" 
"shipping good to australia" 
"shipping good to new zealand" 
"how to emigrate to california from the uk" 
"shipping services from london to usa" 
"cost of shipping from usa to uk" 

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

from collections import Counter 

def count(phrases): 
    counter = Counter() 
    for phrase in phrases: 
     for word in phrase.split(" "): 
      counter[word] += 1 
    return counter 

Это камни, потому что теперь я могу легко приобрести самые общие слова из списка фраз, как так count(phrases).most_common(5)

Теперь это становится все труднее. Скажем, я установил произвольную глубину, скажем 5. Учитывая, что самое популярное слово в этом списке (это не слово клея, например, от или до и), отправляется. Теперь мне нужно взять слово «доставка» и пересчитать все фразы, содержащие доставку терминов, и в большинстве своем простое.

def filter_for_word(word, phrases): 
    return filter(lambda x: word in x, phrases) 
count(filter_for_word("shipping", phrases)) 

Это где он начинает получать волосатые, я должен продолжать идти вниз и вниз результатов, пока я не ударил глубину. И тогда мне нужно будет отображать эту информацию вместе с самыми распространенными фразами.

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

def dive(depth, num, phrases): 
    phrase_tree = {} 
    for word, value in dict(count(phrases).most_common(num)).iteritems(): 
     phrase_tree[word] = [value, {}] 

    current = phrase_tree 
    while True: 
     if depth == 0: 
      return phrase_tree 
     for word in current: 
      current[word][1] = {key: [v, {}] for (key, v) in count(filter_for_word(word, phrases)).most_common(num)} 

     # debug!! 
     return current 

Если кто-то может помочь мне принести все это вместе, я бы очень признателен

+0

Вы хотите сказать, что вы хотите рассчитать самые популярные слова 'w1' во всех фразах, а затем самые популярные слова' w2' в фразах с 'w1', а затем самые популярные слова' w3' в фразах которые имеют 'w2' в ...? – jonrsharpe

+1

Вы можете упростить подсчет с помощью 'itertools.chain.from_iterable':' def count (phrases): return Counter (chain.from_iterable ((w для w в p.split ("")) для p в фразах)) '. Вам не нужно вручную '+ = 1', вот для чего« ​​счетчик »! – jonrsharpe

ответ

0
def filter_for_words(words, phrases): 
    for word in words: 
     phrases = filter(lambda x: word in x, phrases) 
    return phrases 


def dive(depth, num, phrases, phrase_tree=None, f_words=None): 
    if not phrase_tree: 
     phrase_tree = {} 
     for word, value in dict(count(phrases).most_common(num)).iteritems(): 
      phrase_tree[word] = [value, {}] 

    if not f_words: 
     f_words = [] 

    while True: 
     if depth == 0: 
      return phrase_tree 

     for word in phrase_tree: 
      words = f_words[:] 
      words.append(word) 
      child_tree = {key: [v, {}] for (key, v) in count(filter_for_words(words, phrases)).most_common(num)} 
      phrase_tree[word][1] = child_tree 
      dive(depth-1, num, phrases, child_tree, words) 

     return phrase_tree 

Не эффективность, но она должна работать.

+0

Это нормально, но я хочу удалить репликацию на более низких уровнях. Например. 'b [" to "] [1] [" to "] [1] [" to "] [1] [" to "] [1] [" to "] [1] [" to "]' shouldn ' t valid –

+0

@JakobBowyer Итак, я предлагаю вам использовать лучшую структуру данных (реализовать класс узлов). Только использование списка и dict сделает ваш код уродливым. – Liteye

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