Лучший способ определить похожий текст внутри строк? - PullRequest
0 голосов
/ 03 августа 2020

У меня есть список фраз, на самом деле это файл Excel, но при необходимости я могу извлечь каждую строку. Мне нужно найти строку, которая очень похожа, например, одна строка может быть:

ANTIBRATING SSPIRING JOINT (type 2) mod. GA160 (temp.max60°)

и какая-то строка после того, как у меня может быть такая же строка, или эта:

ANTIBRATING SSPIRING JOINT (type 2) mod. GA200 (temp.max60°)

Как вы можете видеть, эти две строки практически одинаковы, в данном случае не равны, но на 98%. Основная проблема в том, что мне нужно обработать около 45 тыс. Строк, по этой причине я ищу способ сделать это быстро. а может и визуальным способом. Первое, что пришло мне в голову, это сравнить самую первую строку со второй, затем третью до конца, и так далее со второй и третьей до последней-1 и сделать что-то вроде оценки, например 1-я строка - 100% с строкой 42, 99% с строкой 522 ... 21% с строкой 22142 et c et c ... Но это только одна идея, возможно, не самая лучшая.

Может быть, уже есть хорошая программа / скрипт / онлайн-сервисы / программа, я искал, но не могу ее найти, поэтому в конце я спросил здесь.

Кто-нибудь знает хороший способ (если это возможно) или скрипт или один онлайн-сервис для этого?

Ответы [ 3 ]

0 голосов
/ 04 августа 2020

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

Однако я хотел бы предложить вам рассмотреть альтернативы:

  1. Вы можете ограничить различия, указав символ c наборы. В приведенном выше примере вы игнорировали числа, но уважали буквы. Если мы можем предположить, что это правило будет всегда выполняться, то мы можем выполнить замену текста в строке.
ANTIBRATING SSPIRING JOINT (type 2) mod. GA160 (temp.max60°) ==> ANTIBRATING SSPIRING JOINT (type _) mod. GA_ (temp.max_°)

Теперь мы можем решить эту проблему, выполнив точное сравнение строк. Это можно сделать с помощью хеширования. Самый простой способ - передать хэш-карту / хэш-набор или базу данных с индексом ha sh в столбце, где вы будете хранить этот скорректированный текст.

Вы можете решить обменять время на пространство. Например, вы можете передать строки в службу, которая построит множество различных вариантов индексов для вашей строки. Например, загрузите в elasticsearch свои данные, а затем выполните на них аналитические c запросы.
0 голосов
/ 12 августа 2020

Нечеткий поиск - ключ к успеху. Я нашел несколько проектов и идей, но тот, который я использовал, это tree-соглашениеp , я знаю, что он довольно старый, но в этом случае у меня работает, я создал этот небольшой скрипт, чтобы помочь мне создать список различия, поэтому я могу вручную проверить это с помощью моего файла

#!/bin/bash

########## CONFIGURATIONS ##########
original_file=/path/jjj.txt
t_agrep_bin="$(command -v tre-agrep)"
destination_file=/path/destination_file.txt
distance=1
########## CONFIGURATIONS ##########

lines=$(grep "" -c "$original_file")

if [[ -s "$destination_file" ]]; then
    rm -rf "$destination_file"
fi

start=1
while IFS= read -r line; do
    echo "Checking line $start/$lines"
    lista=$($t_agrep_bin -$distance -B --colour -s -n -i "$line" $original_file)
    echo "$lista" | awk -F ':' '{print $1}' ORS=' ' >> "$destination_file"
    echo >> "$destination_file"
    start=$((start+1))
done < "$original_file"
0 голосов
/ 03 августа 2020

Вы можете написать сценарий, который будет выполнять следующие действия:

Извлечь данные из файла csv Определите регулярное выражение, которое может сделать вывод о подобии, пример python может быть:

[\w\s]+\([\w]+\)[\w\s]+\([\w°]+\)

Или что-то подобное, обратитесь к документации .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...