docs: def calculate_similar_artists(output_filename, model_name="als"):
      """ generates a list of similar artists in lastfm by utiliizing the 'similar_items'
      api of the models """
      artists, users, plays = get_lastfm()
  
      # create a model from the input data
      model = get_model(model_name)
  
      # if we're training an ALS based model, weight input for last.fm
      # by bm25
      if issubclass(model.__class__, AlternatingLeastSquares):
          # lets weight these models by bm25weight.
          logging.debug("weighting matrix by bm25_weight")
          plays = bm25_weight(plays, K1=100, B=0.8)
  
          # also disable building approximate recommend index
          model.approximate_recommend = False
  
      # this is actually disturbingly expensive:
      plays = plays.tocsr()
  
      logging.debug("training model %s", model_name)
      start = time.time()
      model.fit(plays)
      logging.debug("trained model '%s' in %0.2fs", model_name, time.time() - start)
  
      # write out similar artists by popularity
      start = time.time()
      logging.debug("calculating top artists")
  
      user_count = np.ediff1d(plays.indptr)
      to_generate = sorted(np.arange(len(artists)), key=lambda x: -user_count[x])
  
      # write out as a TSV of artistid, otherartistid, score
      logging.debug("writing similar items")
      with tqdm.tqdm(total=len(to_generate)) as progress:
          with codecs.open(output_filename, "w", "utf8") as o:
              for artistid in to_generate:
                  artist = artists[artistid]
                  for other, score in model.similar_items(artistid, 11):
                      o.write("%s\t%s\t%s\n" % (artist, artists[other], score))
                  progress.update(1)
  
      logging.debug("generated similar artists in %0.2fs",  time.time() - start)