2010-12-12 7 views
1

、[ 'URL'、 'タグ1'、 'TAG2'、..] sおよび検索指定[ 'TAG3'、 'タグ1'、...]の与えられたリストを私は非常にプログラミングに新しいので、私は確信してこれを行うためのより簡単な方法がありますが、私は個人的なブックマークプログラムを作成しようとしています。関連性の高いタグのリストを持つ複数のURLを指定すると、最も関連性の高いURLのリストを返すタグのリストからなる検索を作成できます。私の最初のソリューションは、以下の、最初のタグに1の値が、第二2を与えることであり、そう&上でPythonのリストのソート機能は、残りを行いましょう。 2つの質問:Pythonは質問の並べ替え - 私は、関連するURLリストを返す

1)これを行うには、よりエレガントで効率的な方法がありますか? 2)上記の入力に関連して、関連性によってソートするための他の一般的なアプローチはありますか?

は多くの義務を負います。

# Given a list of saved urls each with a corresponding user-generated taglist 
# (ordered by relevance), the user enters a "search" list-of-tags, and is 
# returned a sorted list of urls. 

# Generate sample "content" linked-list-dictionary. The rationale is to 
# be able to add things like 'title' etc at later stages and to 
# treat each url/note as in independent entity. But a single dictionary 
# approach like "note['url1']=['b','a','c','d']" might work better? 

content = [] 
note = {'url':'url1', 'taglist':['b','a','c','d']} 
content.append(note) 
note = {'url':'url2', 'taglist':['c','a','b','d']} 
content.append(note) 
note = {'url':'url3', 'taglist':['a','b','c','d']} 
content.append(note) 
note = {'url':'url4', 'taglist':['a','b','d','c']} 
content.append(note) 
note = {'url':'url5', 'taglist':['d','a','c','b']} 
content.append(note) 

# An example search term of tags, ordered by importance 
# I'm using a dictionary with an ordinal number system 
# This seems clumsy 
search = {'d':1,'a':2,'b':3} 

# Create a tagCloud with one entry for each tag that occurs 
tagCloud = [] 
for note in content: 
    for tag in note['taglist']: 
     if tagCloud.count(tag) == 0: 
      tagCloud.append(tag) 

# Create a dictionary that associates an integer value denoting 
# relevance (1 is most relevant etc) for each existing tag 

d={}    
for tag in tagCloud: 
    try: 
     d[tag]=search[tag] 
    except KeyError: 
     d[tag]=100 

# Create a [[relevance, tag],[],[],...] result list & sort 
result=[]  
for note in content: 
    resultNote=[] 
    for tag in note['taglist']: 
     resultNote.append([d[tag],tag]) 
    resultNote.append(note['url']) 
    result.append(resultNote) 
result.sort() 

# Remove the relevance values & recreate a list containing 
# the url string followed by corresponding tags. 
# Its so hacky i've forgotten how it works! 
# It's mostly for display, but suggestions on "best-practice" 
# intermediate-form data storage? 

finalResult=[] 
for note in result: 
    temp=[] 
    temp.append(note.pop()) 
    for tag in note: 
     temp.append(tag[1]) 
    finalResult.append(temp) 

print "Content: ", content 
print "Search: ", search 
print "Final Result: ", finalResult 

答えて

2

1)これを行うにははるかにエレガント/効率的な方法があります(私を困ら!)

確実なことを。基本的な考え方:Pythonに何をすべきかを伝えようとしなくて、あなたが望むものを求めてください。

content = [ 
    {'url':'url1', 'taglist':['b','a','c','d']}, 
    {'url':'url2', 'taglist':['c','a','b','d']}, 
    {'url':'url3', 'taglist':['a','b','c','d']}, 
    {'url':'url4', 'taglist':['a','b','d','c']}, 
    {'url':'url5', 'taglist':['d','a','c','b']} 
] 

search = {'d' : 1, 'a' : 2, 'b' : 3} 

# We can create the tag cloud like this: 
# tagCloud = set(sum((note['taglist'] for note in content), [])) 
# But we don't actually need it: instead, we'll just use a default value 
# when looking things up in the 'search' dict. 

# Create a [[relevance, tag],[],[],...] result list & sort 
result = sorted(
    [ 
     [search.get(tag, 100), tag] 
     for tag in note['taglist'] 
    ] + [[note['url']]] 
    # The result will look like [ [relevance, tag],... , [url] ] 
    # Note that the url is wrapped in a list too. This makes the 
    # last processing step easier: we just take the last element of 
    # each nested list. 
    for note in content 
) 

# Remove the relevance values & recreate a list containing 
# the url string followed by corresponding tags. 
finalResult = [ 
    [x[-1] for x in note] 
    for note in result 
] 

print "Content: ", content 
print "Search: ", search 
print "Final Result: ", finalResult 
+0

、感謝します。説明のコメントは多くの助けになります。歓声 –

+0

@ David:答えがあなたの要求に従っていれば、それをアップアップして受け入れることは礼儀正しいと考えられます。 – user225312

+0

ahaはい、それは私をupvoteさせませんでした&私は透明な小さなチェックボックスを逃した。 –

0

私は(例えば「タランチュラ」タグが「自然」tag¹以上の重さでしょう)あなたはまた、それがどのように稀に応じて、各タグに重みを与える示唆しています。指定されたURLの場合は、他のURLと共通している希少なタグには強い関連性をマークする必要があり、指定されたURL ないの頻繁に使用されるタグは、別のURLに存在しながら、ことはダウン関連性をマークする必要があります。

それは私が他のすべてのURLの数値関連の計算として、上述のルールを変換するのは簡単です。素晴らしいことだもちろんの

¹すべてのURLが「タランチュラ」に関連していない限り、:)

+0

うん、面白いアプローチ。乾杯 –

関連する問題