Сравнение текстовых блоков для похожего контента - PullRequest
1 голос
/ 23 сентября 2010

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

Company Name One, Address line 1, line 2, phone, email
..
Random text 
..

Company Name Two 
Address, Phone,email
..
Random text 
..
Company Name 3 
Address, Phone,email

Пример текстового блока два:

..Random Text..
M/s Company Name One Extra Random Text, Address line 1, line 2, phone, 
..random text...
M/s Company Name Two 
Address, Phone
...

Название компании, адрес и т. Д. похожи не одинаковы. Второй блок имеет слова M / s перед всеми названиями компаний. Я хотел бы сделать это в PHP, возможно, с помощью регулярных выражений.

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

Обновление: благодаря @ Wrikken , у меня есть текст в двух строках. Я могу взорвать второй блок, используя M / s , и получить массив. Как мне проверить каждый элемент из этого массива на соответствие первому текстовому блоку, который является одной длинной строкой?

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

Обновление: вывод для кода @Joyce Babu

..Random Text.. ..Random Text.. ..Random Text.. ..Random Text.. ..Random Text.. ..Random Text.. ..Random Text.. ..Random Text.. ..Random Text.. ..Random Text.. M/s Company Name One Extra Random Text, Address line 1, line 2, phone, M/s Company Name One Extra Random Text, Address line 1, line 2, phone, M/s Company Name One Extra Random Text, Address line 1, line 2, phone, M/s Company Name One Extra Random Text, Address line 1, line 2, phone, M/s Company Name One Extra Random Text, Address line 1, line 2, phone, M/s Company Name One Extra Random Text, Address line 1, line 2, phone, M/s Company Name One Extra Random Text, Address line 1, line 2, phone, M/s Company Name One Extra Random Text, Address line 1, line 2, phone, M/s Company Name One Extra Random Text, Address line 1, line 2, phone, M/s Company Name One Extra Random Text, Address line 1, line 2, phone, M/s Company Name One Extra Random Text, Address line 1, line 2, phone, ..random text... ..random text... ..random text... ..random text... ..random text... ..random text... ..random text... ..random text... ..random text... ..random text... M/s Company Name Two M/s Company Name Two M/s Company Name Two M/s Company Name Two M/s Company Name Two M/s Company Name Two M/s Company Name Two M/s Company Name Two M/s Company Name Two M/s Company Name Two Address, Phone Address, Phone Address, Phone Address, Phone Address, Phone Address, Phone Address, Phone Address, Phone Address, Phone Address, Phone ... ... ... ... ... ... ... ... ... ... ... ... 

Выход для @ nikic

array(2) { [0]=>  string(17) "..Random Text.. " [4]=>  string(16) "Address, Phone " } 

Вывод для второго сообщения @Joyce Babu

andom Text..andom Text..andom Text..andom Text..andom Text..andom Text..andom Text..andom Text..andom Text..andom Text..Company Name One Extra Random Text, Address line 1, line 2, phone,Company Name One Extra Random Text, Address line 1, line 2, phone,Company Name One Extra Random Text, Address line 1, line 2, phone,Company Name One Extra Random Text, Address line 1, line 2, phone,Company Name One Extra Random Text, Address line 1, line 2, phone,Company Name One Extra Random Text, Address line 1, line 2, phone,Company Name One Extra Random Text, Address line 1, line 2, phone,Company Name One Extra Random Text, Address line 1, line 2, phone,Company Name One Extra Random Text, Address line 1, line 2, phone,Company Name One Extra Random Text, Address line 1, line 2, phone,Company Name One Extra Random Text, Address line 1, line 2, phone,andom text...andom text...andom text...andom text...andom text...andom text...andom text...andom text...andom text...andom text...Company Name TwoCompany Name TwoCompany Name TwoCompany Name TwoCompany Name TwoCompany Name TwoCompany Name TwoCompany Name TwoCompany Name TwoCompany Name Tworess, Phoneress, Phoneress, Phoneress, Phoneress, Phoneress, Phoneress, Phoneress, Phoneress, Phoneress, Phone

@ Финальный код Джойса Бабу

<?php
set_time_limit(500);
$arOld = file('olddata.txt');
$arNew = file('newdata.txt');
$G=0;
    $c=0;

    foreach($arNew as $line){
    if(substr($line, 0, 4) == 'M/s '){
    $c++;   
    echo "<BR/>".$c.".)";
        $line = trim(substr($line, 4));
        foreach($arOld as $old){
            similar_text($line, $old, $percentage);
            if ($percentage > 80){
                continue;
            }
        }
        echo $line;
    }else{
    $G++;
    }
}
echo "<br/>".$G . " DID NOT MATCH";
?>

@ Выход из окончательного кода Джойса Бабу

1.)Company Name One Extra Random Text, Address line 1, line 2, phone,
2.)Company Name Two
4 DID NOT MATCH

Ответы [ 5 ]

2 голосов
/ 04 октября 2010

Попробуйте это

set_time_limit(500)
$arOld = file('olddata.txt');
$arNew = file('newdata.txt');
foreach($arNew as $line){
    if(substr($line, 0, 3) === 'M/s '){
        $line = trim(substr($line, 3));
        foreach($arOld as $old){
            similar_text($line, $old, $percentage);
            if ($percentage > 80){
                continue;
            }
        }
        echo $line;
    }
}
2 голосов
/ 23 сентября 2010

Создайте массив обоих (возможно, используя функцию file(), в зависимости от формата текста, или, возможно, просто explode() для содержимого), и используйте array_diff().

1 голос
/ 04 октября 2010

Если нет ключевых полей для уникальной идентификации записей, я думаю, вам придется использовать что-то вроде Similar_text или levenshtein .

$arOld = file('olddata.txt');
$arNew = file('newdata.txt');
foreach($arNew as $line){
   $line = trim(substr($line, 3));
   foreach($arOld as $old){
    similar_text($line, $old, $percentage);
    if ($percentage < 60){
        echo $line;
    }
   }
}
1 голос
/ 28 сентября 2010
$oldList = file('oldList.txt');
$newList = file('newList.txt');
$list = array_udiff($newList, $oldList, 'compare');

function compare($new, $old) {
    similar_text($old, substr($new, 3), $percent);
    return $percent >= 80 ? 0 : 1;
}

Это моя основная идея. Найти все похожие тексты на 80% и удалить их из $newList. Вы должны отрегулировать процент, чтобы удовлетворить ваши потребности. M/s удаляется substr($new, 3).

1 голос
/ 23 сентября 2010

если вам нужно сравнить эти списки только один раз, я бы посоветовал конвертировать документы в txt, и тогда вы сможете сравнивать их с помощью регулярных выражений.в противном случае вам потребуется использовать стороннее программное обеспечение для доступа к информации в документах ... как здесь может быть Чтение / запись файла MS Word на PHP

...