Nano Hash - криптовалюты, майнинг, программирование

Вычисление сходства Jaccard в двух списках для возврата слов с наибольшим сходством в Python

У меня есть огромный список (содержащий ~ 250 тысяч слов), который был уникальным словом. (Произнесите список1)

У меня есть еще один список, содержащий 5 слов с ошибками. (Произнесите список2)

Мне нужно найти сходство с жаккардом (на основе разных ngrams). между двумя списками и вернуть ближайшее совпадающее слово из list1. Работая над несколькими ответами, которые я нашел на этом сайте, я смог:

  1. Разделите оба списка на ngrams с помощью функции.
  2. Вычислите сходство Жаккара для первого элемента второго списка и первого списка.

Это дает мне правильный ответ. Однако я не могу продолжить отсюда, чтобы вернуть наиболее подходящие слова из list1. Я знаю, что мне нужно применить функцию ngram к каждому элементу моего списка1. А затем вычислите сходство жаккарда со списком2 и верните из него элемент с максимальным значением. Но не удалось реализовать это через цикл. Это код, который я использую:

def spell_correcter(list2=['word1', 'word2',... 'word5']):
    from sklearn.metrics import jaccard_similarity_score
    import re

    def find_ngrams(text: str, number: int=3) -> set:
    #returns a set of ngrams for the given string

        if not text:
            return set()

        str1 = ''.join(text)
        words = [f'  {x} ' for x in re.split(r'\W+', str1.lower()) if x.strip()]

        ngrams = set()

        for word in words:
            for x in range(0, len(word) - number + 1):
                ngrams.add(word[x:x+number])

        return ngrams


    def similarity(text1: str, text2: str, number: int=3) -> float:
    #Finds the similarity between 2 strings using ngrams.

        ngrams1 = find_ngrams(text1, number)
        ngrams2 = find_ngrams(text2, number)
        num_unique = len(ngrams1 | ngrams2)
        num_equal = len(ngrams1 & ngrams2)

        #Tried to compute for entire list1; very slow. Didn't execute
        #for i in range(0, len(text1)):
            #ngrams1 = find_ngrams(text1, number)
            #num_unique = len(ngrams1 | ngrams2)
            #num_equal = len(ngrams1 & ngrams2)
            #jaccard = float(num_equal) / float(num_unique)


        return float(num_equal) / float(num_unique)

    b = list2[0]
    a = similarity(list1, b)

    return a

Может ли кто-нибудь помочь с этим кодом?


Ответы:


1

Shingling — это процесс создания единого объекта путем взятия последовательных слов и их группировки.
Мы размечаем список 1 и создаем ngram fo len(list2) и вычисляем сходство жаккарда каждой ngram со списком 2. Это даст наиболее похожие слова в списке 1 со словами в списке 2:

def jaccard_similarity(list_x, list_y):
    set_x = set(list_x)
    set_y = set(list_y)
    intersection = set_x.intersection(set_y)
    union = set_x.union(set_y)
    return len(intersection) / len(union) if len(union) > 0 else 0

def shingling_jaccard_similarity(text_x, text_y, n):
    x = list(nltk.ngrams(tokenizer.tokenize(text_x), n))
    y = list(nltk.ngrams(tokenizer.tokenize(text_y), n))
    sim_score = jaccard_similarity(x,y)
    return sim_score

shingling_jaccard_similarity(list1, list2, len(list2))
24.04.2021
  • Можете ли вы добавить объяснение, почему это работает? 24.04.2021
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..