2014-02-05 3 views
0

Итак, я пытаюсь создать дерево с помощью Python, чтобы попробовать и прочитать текстовый файл, который повторяет количество в файле, и попытаться создать дерево из этих значений и возвращать предложения с помощью значений Top 3 (поясняется более подробно ниже).Использование дерева в python для получения значений

Прежде всего я искал на wikipedia о том, как создается дерево, а также видел предыдущие примеры в stackoverflow как: This one. и This one. Тем не менее, я смог сделать это только в том случае, если код идет:

import fileinput 

setPhrasesTree = 0 


class Branch(): 
    def __init__(self, value): 
     self.left = None 
     self.right = None 
     self.value = value 

class Tree(): 
    def __init__(self): 
     self.root = None 
     self.found = False 

    #lessThan function needed to compare strings 
    def lessThan(self, a, b):  
     if len(a) < len(b): 
      loopCount = len(a) 
     else: 
      loopCount = len(b)   
     for pos in range(0, loopCount): 
      if a[pos] > b[pos]: 
       return False   
     return True 

    def insert(self, value): 
     self.root = self.insertAtBranch(self.root, value) 

    def exists(self, value): 
     #set the class variable found to False to assume it is not there  
     self.found = False 
     self.findAtBranch(self.root, value) 
     return self.found 

    #Used to fine a value in a tree 
    def findAtBranch(self, branch, value):   
     if branch == None: 
      pass 
     else: 
      if branch.value == value: 
       self.found = True     
      else: 
       self.findAtBranch(branch.left, value) 
       self.findAtBranch(branch.right, value)   

    def insertAtBranch(self, branch, value): 
     if branch == None: 
      return Branch(value) 
     else: 
      if self.lessThan(branch.value, value): 
       branch.right = self.insertAtBranch(branch.right, value)    
      else: 
       branch.left = self.insertAtBranch(branch.left, value) 
      return branch 

def loadTree(filename, treeType): 

    if treeType == setPhrasesTree: 
     for sentence in fileinput.input("setPhrases.txt"): 
      print(sentence) 
      setPhrases.insert(sentence[:-1]) 


def findSentenceType(sentence): 

    if sentence.exists(sentence): 
     return setPhrasesTree 

Вот как выглядит текстовый файл. Голые в виду, что она целенаправленно выложили, как это и не со значением величины рядом с ним (имя файла = setPhrases.txt):

Hi my name is Dave. 
Thank-You. 
What is your name? 
I have done all my homework. 
What time is dinner? 
What is your name? 
Thank-You. 
Hi my name is Dave. 
What is your name? 
I have done all my homework. 
What is your name? 
Can you bring me a drink Please? 
Can you bring me a drink Please? 
What is your name? 
Hi my name is Dave. 
What is your name? 
Can you bring me a drink Please? 

Вот что я пытаюсь получить мой код, чтобы сделать. Мне нужно, чтобы он понял, что первое предложение в файле является стартовым узлом. И тогда ему нужно подсчитать все остальные предложения, которые являются одинаковыми, и добавить значение к этому предложению и просто использовать дерево, чтобы это можно было сделать. (Я изначально делал это по-другому, однако мне нужно использовать дерево, чтобы иметь возможность подсчитывать и делать все другие вещи) Вот что я имею в виду: enter image description here

Затем я хочу, чтобы иметь возможность вернуться верхняя 3 Phrases с наивысшими частотами. Таким образом, в этом случае система будет возвращать предложения (в таком порядке):

What is your name? 
Hi my name is Dave. 
Can you bring me a drink please? 

Любая помощь очень ценится. Также спасибо за ваше время.

+0

Правильно ли я понимаю, вы просто хотите подсчитать, как часто каждая строка присутствует в файле? Для этого вам вряд ли нужно дерево. – pentadecagon

+0

@pentadecagon True, и, как я уже упоминал ранее, я уже смог это сделать. Однако мне нужно сделать это, используя дерево, и я не знаю, что делать дальше. – PythonNovice

+0

Дерево не требуется? Так это упражнение? Чтобы быть уверенным, потому что вы знаете, эта проблема может быть решена более эффективно, используя словарь вместо дерева, примерно в 20 строках кода. Если вы действительно хотите дерево, то для того, чтобы дерево было полезным, вероятно, это должно быть какое-то [самобалансирующееся дерево] (http://en.wikipedia.org/wiki/Self-balancing_binary_search_tree), наиболее популярное здесь [красно-черное дерево] (http://en.wikipedia.org/wiki/Red-black_tree). Это довольно много работы по реализации самостоятельно. – pentadecagon

ответ

0

Здесь вы идете, реализация с использованием словаря. Это то, что вы хотите?

import collections 
def count_lines(): 
    d = collections.defaultdict(int) 
    for line in open("phrases.txt"): 
     d[ line.strip() ] += 1 

    # we use the negative count as sort key, so the biggest ends up first 
    a = sorted(d.items(), key=lambda x : -x[1]) 
    for n, u in enumerate(a[:3]): 
     print(u[0], "# count=", u[1]) 

count_lines()   
Смежные вопросы