Вашему вниманию предлагается проба пера по сравнению двух текстов. UDF.
Все операции поделены на функции, каждую функцию можно использовать отдельно в принципиально других задачах.
Общее описание:
На функцию подаются два диапазона с разными текстами. Тексты очищаются от посторонних символов и заранее подготовленных на листе Excl "шумовых" слов. Можно провести аналогию с методом шинглов, где длина шингла равна единице. N-граммы в исключения пользователь может добавить по вкусу, я принципиально выбрал N = 1. Функция проверяет количество оставшихся уникальных слов, совпадающих с другим текстом.
Что "под капотом".
[vba]
Код
Option Explicit Option Base 1
Public Exclusions() As String
'Author: Roman "Rioran" Voronov 'Date: the 10-th of March, 2015 'Feedback: voronov_rv@mail.ru
Function Text_Compare(RngA As Range, RngB As Range) As String 'Основная функция, анализирует диапазоны. End Function
Function Array_Compare(Arr1 As Variant, Arr2 As Variant) As Long 'Функция проверки количества совпадающих строк в массивах End Function
Function Normalize_Array(RngA As Range) As Variant 'Преобразует диапазон в массив и удаляет дублирующиеся значения End Function
Function Range_to_Array(RngX As Range) As Variant 'Создаёт массив массивов строк из диапазона End Function
Function String_to_Array(StrX As String) As Variant 'Разбивает строку на массив по пробелу End Function
Private Function CleanStr(StrX As String) As String 'Очищает текстовую строку от посторонних символов и исключений End Function
Private Function ExcludeWords(StrX As String) As String 'Заменяет в строке слова исключения на пробелы End Function
Public Sub Initiate_Exclusions() 'Собирает исключения с отдельного листа в публичный массив End Sub
Function Only_Unique_Values(ArrA As Variant) As Variant 'Очищает массив от дублей строк End Function
Private Function Complex_Array_to_Simple(ArrA As Variant) As Variant 'Превращает массив массивов строк в обычный одномерный массив End Function
[/vba]
Мой словарь исключений далеко не претендует на идеал, можете дополнять и предлагать свои варианты.
Если есть желающие потренироваться и усложнить алгоритм - предлагаю подумать на тему "Дистанция Левенштейна между шинглами длины Х, где Х больше 2-х".
Если на форуме есть преподаватели, которые получают от учащихся работы в письменных вариантах - просьба протестировать явно "слизанные" работы между собой и работы честные. Интересно узнать, как этот способ работает на практике и какой уровень сходства считать критическим.
Всем привет и хорошего настроения!
Вашему вниманию предлагается проба пера по сравнению двух текстов. UDF.
Все операции поделены на функции, каждую функцию можно использовать отдельно в принципиально других задачах.
Общее описание:
На функцию подаются два диапазона с разными текстами. Тексты очищаются от посторонних символов и заранее подготовленных на листе Excl "шумовых" слов. Можно провести аналогию с методом шинглов, где длина шингла равна единице. N-граммы в исключения пользователь может добавить по вкусу, я принципиально выбрал N = 1. Функция проверяет количество оставшихся уникальных слов, совпадающих с другим текстом.
Что "под капотом".
[vba]
Код
Option Explicit Option Base 1
Public Exclusions() As String
'Author: Roman "Rioran" Voronov 'Date: the 10-th of March, 2015 'Feedback: voronov_rv@mail.ru
Function Text_Compare(RngA As Range, RngB As Range) As String 'Основная функция, анализирует диапазоны. End Function
Function Array_Compare(Arr1 As Variant, Arr2 As Variant) As Long 'Функция проверки количества совпадающих строк в массивах End Function
Function Normalize_Array(RngA As Range) As Variant 'Преобразует диапазон в массив и удаляет дублирующиеся значения End Function
Function Range_to_Array(RngX As Range) As Variant 'Создаёт массив массивов строк из диапазона End Function
Function String_to_Array(StrX As String) As Variant 'Разбивает строку на массив по пробелу End Function
Private Function CleanStr(StrX As String) As String 'Очищает текстовую строку от посторонних символов и исключений End Function
Private Function ExcludeWords(StrX As String) As String 'Заменяет в строке слова исключения на пробелы End Function
Public Sub Initiate_Exclusions() 'Собирает исключения с отдельного листа в публичный массив End Sub
Function Only_Unique_Values(ArrA As Variant) As Variant 'Очищает массив от дублей строк End Function
Private Function Complex_Array_to_Simple(ArrA As Variant) As Variant 'Превращает массив массивов строк в обычный одномерный массив End Function
[/vba]
Мой словарь исключений далеко не претендует на идеал, можете дополнять и предлагать свои варианты.
Если есть желающие потренироваться и усложнить алгоритм - предлагаю подумать на тему "Дистанция Левенштейна между шинглами длины Х, где Х больше 2-х".
Если на форуме есть преподаватели, которые получают от учащихся работы в письменных вариантах - просьба протестировать явно "слизанные" работы между собой и работы честные. Интересно узнать, как этот способ работает на практике и какой уровень сходства считать критическим.Rioran