Как найти аналогичное предложение

Как найти похожие тексты и отсортировать

Время на прочтение
2 мин

Количество просмотров 4.6K

Есть простой метод отсортировать набор текстов по похожести на заданный текст: по Эвклидову расстоянию между частотами слов в анализируемых текстах. В принципе, на этом алгоритм должен быть понятен, простую реализацию можно найти здесь.

Как ни удивительно, простой метод даёт хорошие результаты. Например, если ищем следующую книгу чтоб почитать, можно ввести текст прочтённой книги или нескольких прочтённых книг как образец для поиска, и тогда для этого репозитория из 10 книг получаем следующие результаты для книги «FAIRY TALES By The Brothers Grimm»:

0.0320757 RepoTHE ADVENTURES OF TOM SAWYER.txt
0.0363329 RepoA TALE OF TWO CITIES - A STORY OF THE FRENCH REVOLUTION.txt
0.0388528 RepoALICEТS ADVENTURES IN WONDERLAND.txt
0.0440605 RepoMOBY-DICK or, THE WHALE.txt
0.046679 RepoTHE ADVENTURES OF SHERLOCK HOLMES.txt
0.0472574 RepoThe Iliad of Homer.txt
0.0511793 RepoThe Romance of Lust.txt
0.053746 RepoPRIDE AND PREJUDICE.txt
0.0543531 RepoBEOWULF - AN ANGLO-SAXON EPIC POEM.txt
0.0557194 RepoFrankenstein; or, the Modern Prometheus.txt

Как видно из результатов, наиболее похожими обнаружены сказкоподобные книги, а наименее похожей — книга ужасов.

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

Другое применение — в нахождении резюме из базы по примеру резюме кандидата, который подходит на данную позицию, но не желает присоединиться или уходит из компании. Поиск замены работнику — не такой уж и редкий бизнес-случай. Также можно отсортировать базу резюме по похожести на описание вакансии.

P.S. Кстати, Хабр в списке похожих статей выдаёт что-то не сильно похожее. Может Хабру тоже применить данный метод?

Мы используем
файлы cookie

На всех наших сайтах, включая этот,
мы используем куки, потому что эти файлы
экономят ваше время и продлевают вашу жизнь.

Характеристики сервиса по сравнению текстов

Сравнение текстов онлайн — какие опции выполняет этот сервис? Довольно часто бывает так, что копирайтеры, юристы или бухгалтеры могут работать, с двумя практически одинаковыми текстами, но при этом им необходимо понимать, где именно и в чем они отличаются. Возникает вопрос: как найти сравнение в тексте? С помощью нашей программы для сравнения двух текстов от Prostudio, вы сможете осуществить сравнение текстов на схожесть или наоборот найти различия среди них.

Наш сервис для сравнения двух текстов онлайн довольно легок в использовании и эффективен для сравнения теста или даже программного кода. С его помощью человек без труда сможет найти отличия между двумя текстами. Сравнение 2-х текстов онлайн состоит всего из одного действия: от вас лишь потребуется вставить два текста в текстовые поля и кликнуть на кнопку «Получить результат».

К тому же наша программа сравнения текстов онлайн с выделением слов и символов, которые отличаются друг от друга, поэтому вы моментально сможете увидеть все отличия. Анализ текста на соответствие или различия никогда ранее не был настолько легким. Сравнение договоров, кода, или прочих материалов будет осуществляться в разы быстрее.

Как находить похожие запросы

Внизу страницы результатов сравнения в Google Trends можно просмотреть похожие запросы.

Если вы указали несколько запросов, регионов или периодов времени, популярные похожие запросы будут показаны на отдельных вкладках.

Самые популярные запросы

Популярными запросами мы называем слова или словосочетания, которые искали чаще всего вместе с указанным вами термином в рамках выбранной категории, страны или региона. Если сегодня вы еще ничего не искали, то в этом разделе представлены все популярные запросы.

Запросы, набирающие популярность

Эти запросы включают в себя термины, которые за указанное время все чаще и чаще искали пользователи вместе с указанным словом (или искали вообще, если вы пока не вводили запрос). Популярность этих запросов выражается процентным соотношением прироста и значений за предыдущие периоды. Если термин стал популярнее более чем на 5000%, то вместо доли в процентах вы увидите сообщение «Сверхпопулярность».

Как сообщить о нежелательных похожих запросах

Мы удаляем из сервиса Google Trends поисковые запросы сексуального характера, однако не весь неприемлемый контент удается таким образом исключить. Обнаружив его, вы можете сообщить нам о нем. Для этого нажмите Отправить отзыв внизу любой страницы сервиса.

Спорные темы не фильтруются в Google Trends.

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

Несколько методов, обычно используемых для определения подобия предложений:
1. Изменить расстояние
2. Расчет коэффициента Джекарда
3. Расчет Word2Vec

Расстояние редактирования, называемое на английском языке расстоянием редактирования, также известное как расстояние Левенштейна, относится к минимальному количеству операций редактирования, необходимых для преобразования двух строк из одной в другую.
Чем больше расстояние, тем больше они различаются. Разрешенные операции редактирования включают замену одного символа другим, вставку символа и удаление символа.

Например, у нас есть две строки: строка и параметр. Если мы хотим преобразовать строку в параметр, нам понадобятся следующие два шага:

Первый шаг — добавить символ e между s и t.
На втором этапе замените r на t.
Таким образом, их разница в расстоянии редактирования равна 2, что соответствует минимальному количеству шагов, которые необходимо изменить (добавить, заменить, удалить) для двух преобразований.

Установка: расстояние установки pip3

import distance

 str1 = "Где находится адрес компании"
 str2 = "Где компания?"

def edit_distance(s1, s2):
    return distance.levenshtein(s1, s2)

print(edit_distance(str1, str2))

Если вы хотите получить похожий текст, вы можете напрямую установить пороговое значение расстояния редактирования для его достижения, например, установите расстояние редактирования равным 2.

def edit_distance(s1, s2):
    return distance.levenshtein(s1, s2)

strings = [
    'что ты делаешь', 
         'Что делаешь',
         'что ты делаешь', 
         'Здравствуйте', 
         'Я люблю бананы'
]

 target = 'Что ты делаешь'
results = list(filter(lambda x: edit_distance(x, target) <= 2, strings))
print(results)
 # ['Что ты делаешь?', 'Что ты делаешь?]

Расчет коэффициента Жаккара

Коэффициент Жаккара, называемый на английском языке индексом Жаккара, также известный как коэффициент подобия Жаккара, используется для сравнения сходства и различия между конечными наборами выборок. Чем больше значение коэффициента Жаккара, тем выше сходство выборки.

Фактически, его метод расчета очень прост, то есть значение, полученное путем деления пересечения двух выборок на объединение. Когда две выборки в точности совпадают, результат равен 1, а когда две выборки полностью разные, результат равен 0.

Алгоритм очень простой, то есть пересечение делится на объединение, давайте воспользуемся кодом Python для его реализации:

from sklearn.feature_extraction.text import CountVectorizer
import numpy as np

def jaccard_similarity(s1, s2):
    def add_space(s):
        return ' '.join(list(s))

         # Добавить пробелы между словами
    s1, s2 = add_space(s1), add_space(s2)
         # Преобразовать в матрицу TF
    cv = CountVectorizer(tokenizer=lambda s: s.split())
    corpus = [s1, s2]
    vectors = cv.fit_transform(corpus).toarray()
         # Получите словарный запас
    ret = cv.get_feature_names()
    print(ret)
         # Искать пересечение
    numerator = np.sum(np.min(vectors, axis=0))
         # В поисках союза
    denominator = np.sum(np.max(vectors, axis=0))
         # Рассчитать коэффициент Жаккара
    return 1.0 * numerator / denominator


 s1 = 'что ты делаешь'
 s2 = 'Что ты делаешь?'
print(jaccard_similarity(s1, s2))

Word2Vec, как следует из названия, на самом деле представляет собой процесс преобразования каждого слова в вектор. Если вы не знаете, можете обратиться к:https://blog.csdn.net/itplus/article/details/37969519。

Словесная векторная модель Word2Vec представляет собой обученный корпус китайского языка Википедии. Модель здесь имеет 250 измерений и 50 измерений. Чем больше размер вектора, тем больше модель и тем сложнее расчет. При обычном использовании требуется небольшая модель. Было обнаружено, что 50-мерная модель аналогична. , Пожалуйста, обратитесь к предыдущей статье, чтобы узнать о методе обучения и загрузке модели.
Процесс:
01, разделите предложение
02. Удалите ненужную сегментацию слов.
03, вычислить средний вектор слов предложения
04, косинусное сходство

Разделите предложение: Python предоставляет множество доступных библиотек, выбирайте свои
Удалите бесполезные причастия: удалите бесполезные модальные частицы и т. д., чтобы уменьшить влияние на вычисление среднего вектора слов предложения.
AVG-W2V используется для вычисления среднего вектора предложения, и вычисляется средний вектор предложения, поэтому шаг 02 особенно важен.
Косинусное сходство:

Косинусное подобие np.linalg.norm (norm) (вторая норма вектора - это длина вектора в традиционном понимании
dist1=float(np.dot(vec1,vec2)/(np.linalg.norm(vec1)*np.linalg.norm(vec2)))
def key_words_ask_method(sentence1, sentence2):
    '''
         Потому что, если это # ​​1: AVG-W2V 2: AVG-W2V-TFIDF, требуется среднее значение,
         Divisor: определяет размер всех данных Dividend: влияет на среднее значение
         Поэтому очень важен стандарт сегментации слов, с которым можно надлежащим образом обращаться с помощью настраиваемых словарей, стоп-слов и семантического анализа.
    '''
    vec1 = sentence_to_vec(sentence1)
    vec2 = sentence_to_vec(sentence2)

         # Нулевой вектор возвращается напрямую
    if (vec1 == np.zeros(WORD_VECTOR_DIM)).all() == True or (vec2 == np.zeros(WORD_VECTOR_DIM)).all() == True:
                 возврат "не соответствует подобию"

    # score = cos(vec1, vec2)
    # print(score)
    # if score < COSINE_CRITICAL_VALUE:
    #     return "1"
    # else:
    #     return "0"

         # Косинусное подобие np.linalg.norm (norm) (вторая норма вектора - это длина вектора в традиционном смысле
    dist1=float(np.dot(vec1,vec2)/(np.linalg.norm(vec1)*np.linalg.norm(vec2)))
    print("score:", dist1)
    if dist1 > 0.92:
                 return "Эти два предложения похожи"
    else:
                 return "Эти два предложения не похожи"

Содержание статьи синхронизировано с официальным аккаунтом: Питон монах начальной школы, приветствую ваше внимание

from nltk.stem import PorterStemmer

from nltk.tokenize import word_tokenize, sent_tokenize

import nltk

from nltk.corpus import stopwords

nltk.download('stopwords')

ps = PorterStemmer()

f = open('romyyy.txt')

a = sent_tokenize(f.read())

stop_words = list(stopwords.words('english'))

punc =

s = [(word_tokenize(a[i])) for i in range(len(a))]

outer_1 = []

for i in range(len(s)):

    inner_1 = []

    for j in range(len(s[i])):

        if s[i][j] not in (punc or stop_words):

            s[i][j] = ps.stem(s[i][j])

            if s[i][j] not in stop_words:

                inner_1.append(s[i][j].lower())

    outer_1.append(set(inner_1))

rvector = outer_1[0]

for i in range(1, len(s)):

    rvector = rvector.union(outer_1[i])

outer = []

for i in range(len(outer_1)):

    inner = []

    for w in rvector:

        if w in outer_1[i]:

            inner.append(1)

        else:

            inner.append(0)

    outer.append(inner)

comparison = input("Input: ")

check = (word_tokenize(comparison))

check = [ps.stem(check[i]).lower() for i in range(len(check))]

check1 = []

for w in rvector:

    if w in check:

        check1.append(1

    else:

        check1.append(0)

ds = []

for j in range(len(outer)):

    similarity_index = 0

    c = 0

    if check1 == outer[j]:

        ds.append(0)

    else:

        for i in range(len(rvector)):

            c += check1[i]*outer[j][i]

        similarity_index += c

        ds.append(similarity_index)

ds

maximum = max(ds)

print()

print()

print("Similar sentences: ")

for i in range(len(ds)):

    if ds[i] == maximum:

        print(a[i])

Понравилась статья? Поделить с друзьями:
  • Как найти значок настройки на айфоне
  • Как найти катионы натрия
  • Ссылка профиля в инстаграме как найти
  • Как найти кубический метр бассейна
  • Как найти могилу умершего родственника на кладбище