2016-08-24 5 views
0

Ich brauche Hilfe die zyklomatische Komplexität des folgenden Codes zu reduzieren:Python: zyklomatische Komplexität reduzieren

def avg_title_vec(record, lookup): 
    avg_vec = [] 
    word_vectors = [] 
    for tag in record['all_titles']: 
     titles = clean_token(tag).split() 
     for word in titles: 
      if word in lookup.value: 
       word_vectors.append(lookup.value[word]) 
    if len(word_vectors): 
     avg_vec = [ 
      float(val) for val in numpy.mean(
       numpy.array(word_vectors), 
       axis=0)] 

    output = (record['id'], 
       ','.join([str(a) for a in avg_vec])) 
    return output 

Beispiel Eingabe:

record ={'all_titles': ['hello world', 'hi world', 'bye world']} 

lookup.value = {'hello': [0.1, 0.2], 'world': [0.2, 0.3], 'bye': [0.9, -0.1]} 

def clean_token(input_string): 
    return input_string.replace("-", " ").replace("/", " ").replace(
    ":", " ").replace(",", " ").replace(";", " ").replace(
    ".", " ").replace("(", " ").replace(")", " ").lower() 

So werden alle Wörter, die in der lookup.value vorhanden sind Ich nehme den Durchschnitt ihrer Vektorform.

+1

Stört es Sie zu erklären, was der Code an erster Stelle versucht? –

+0

Weitere Details hinzugefügt – futurenext110

+0

Ich habe es von Anfang an versucht, selbst zu programmieren, und ich endete mit dem gleichen Code :) –

Antwort

0

Es zählt wahrscheinlich nicht wirklich als richtige Antwort, da am Ende die zyklomatische Komplexität nicht reduziert wird.

Diese Variante ist ein bisschen kürzer, aber ich kann nicht sehen, wie es verallgemeinert werden kann. Und es scheint, dass Sie diese if s benötigen.

def avg_title_vec(record, lookup): 
    word_vectors = [lookup.value[word] for tag in record['all_titles'] 
        for word in clean_token(tag).split() if word in lookup.value] 
    if not word_vectors: 
     return (record['id'], None) 
    avg_vec = [float(val) for val in numpy.mean(
       numpy.array(word_vectors), 
       axis=0)] 

    output = (record['id'], 
       ','.join([str(a) for a in avg_vec])) 
    return output 

Ihr CC ist 6, was bereits gut ist, nach this. Sie können mit Hilfsfunktionen, wie

def get_tags(record): 
    return [tag for tag in record['all_titles']] 

def sanitize_and_split_tags(tags): 
    return [word for tag in tags for word in 
      re.sub(r'[\-/:,;\.()]', ' ', tag).lower().split()] 

def get_vectors_words(words): 
    return [lookup.value[word] for word in words if word in lookup.value] 

CC Ihre Funktion reduzieren Und es wird durchschnittlich CC fallen, aber insgesamt CC wird die gleiche oder erhöhen bleiben. Ich sehe nicht, wie Sie diese if s überprüfen können, ob das Wort in lookup.value oder überprüfen, ob wir irgendwelche Vektoren haben, mit zu arbeiten.

Verwandte Themen