Сокращение времени выполнения для вычисления косинусного сходства между двумя списками в Python - PullRequest
0 голосов
/ 09 октября 2019

Я собираю словарь хештега в твиттере, используя Python. Ключами является сам хэштег, и соответствующая запись представляет собой большую коллекцию твитов, которые содержат этот хэштег, добавленный в конец. У меня есть отдельный список всех твитов без хэштегов, и я добавляю их в словарные статьи в соответствии с косинусным сходством. Все работает, но ОЧЕНЬ медленно (несколько часов на 4000 твитов). Вложенные циклы for дают мне время выполнения O (N ^ 2). У кого-нибудь есть какие-либо идеи о том, как я могу улучшить свое время выполнения? Любые предложения будут с благодарностью!

taglessVects = normalize(vectorizer.transform(needTags))
    dictVects = normalize(vectorizer.transform(newDict))

   #newDict contains: newDict[hashtag]: "tweets that used that hashtag"
   #needTags is a list of all the tweets that didn;t use a hashtag
    for dVect, entry in zip(dictVects, newDict):
        for taglessVect, tweet in zip(taglessVects, needTags):
            if cosine_similarity(taglessVect, dVect) > .9:
                newDict[entry] = newDict[entry] + ' ' + tweet


    return newDict

1 Ответ

0 голосов
/ 09 октября 2019

Вы создали алгоритм ближайшего соседа методом грубой силы, используя косинусное расстояние в качестве метрики. Документы sklearn на эту тему хороши.

Sklearn реализует более оптимизированные версии, которые должны быть быстрее. Вы можете использовать их, но нужно изменить свои словари. Вы захотите каким-то образом отобразить вектор на соответствующий твит.

from sklearn.neighbors import NearestNeighbors
neigh = NearestNeighbors(1, metric='cosine')
neigh.fit(dictVects)  

nearest = neigh.kneighbors(taglessVects, return_distance=False)
for x, y in zip(taglessVects, nearest):
    z = y[x][0]
    # z is the nearest tweet vector to the tagless vector x
...