СПОСОБ ОБНАРУЖЕНИЯ ТЕКСТОВЫХ ОБЪЕКТОВ
METHOD TO DETECT TEXT OBJECTS

Область техники, к которой относится изобретение
Настоящее изобретение относится к способу обнаружения текстовых объектов и может быть использовано при разработке новых и совершенствовании существующих систем проверки текстовых документов на наличие в них конкретных выражений.
Уровень техники
При проверке текстовых документов бывает необходимо выявлять наличие в них конкретных выражений. Это может, например, происходить при отслеживании документов, проходящих по сети компании, на предмет наличия в них той или иной конфиденциальной информации.
Существуют различные способы для решения этой проблемы.
Например, в патенте России №2253893 (опубл. 10.06.2005) раскрыт способ автоматизированного анализа электронных документов, в котором выделяют устойчивые формулировки, участвующие в дальнейшем анализе документа. Сходный способ раскрыт в патентах США №7130850 (опубл. 31.10.2006) и №7225188 (опубл. 29.05.2007). Эти способы достаточно трудоемки и пригодны лишь в ограниченной области.
В выложенной заявке на патент Японии №2008-257444 (опубл. 23.10.2008) предложен способ управления файлами документов, в котором выделяют особенности в файле за счет использования предписанных выражений и вычисляют сходство между файлами путем сравнения этих особенностей. Этот способ также имеет лишь ограниченное применение.
В заявках на патент Китая №101520770 (опубл. 02.09.2009) и №101814065 (опубл. 25.08.2010) описаны способы использования регулярных выражений, получаемых с помощью заданных правил. Этот способ также имеет ограниченное применение.
Раскрытие изобретения
Таким образом, существует потребность в расширении арсенала технических средств за счет создания сравнительно быстрого способа обнаружения текстовых объектов, который бы преодолевал недостатки известных технических решений.
Для решения этой задачи и получения указанного технического результата в настоящем изобретении предложен способ обнаружения текстовых объектов, заключающийся в том, что формируют для каждого подлежащего обнаружению текстового объекта список регулярных выражений, каждое из которых описывает данный текстовый объект; создают синтаксический анализатор, предназначенный для осуществления синтаксического анализа регулярных выражений; генерируют на основе синтаксического анализатора индивидуальный конечный автомат для каждого регулярного выражения; объединяют индивидуальные конечные автоматы всех регулярных выражений в по меньшей мере один поисковый автомат, предназначенный для поиска упомянутых текстовых объектов; и запускают поисковые автоматы на тексте подлежащего проверке документа для обнаружения в нем строк, содержащих текстовые объекты.
Особенность способа по настоящему изобретению состоит в том, что для каждого из индивидуальных конечных автоматов могут генерировать соответствующий инвертированный конечный автомат, каждый из которых предназначен для распознавания в обратном порядке соответствующего регулярного выражения в текстовых объектах; обнаруживать, с помощью поисковых автоматов, окончание каждой строки, входящей в язык какого-либо из упомянутых регулярных выражений; и запускать соответствующий обнаруженному регулярному выражению инвертированный конечный автомат от обнаруженного окончания строки для нахождения начала строки, соответствующей данному регулярному выражению.
Еще одна особенность способа по настоящему изобретению состоит в том, что дополнительно могут верифицировать по меньшей мере некоторые из обнаруженных регулярных выражений.
Еще одна особенность способа по настоящему изобретению состоит в том, что поисковый автомат могут минимизировать относительно количества его состояний.
Еще одна особенность способа по настоящему изобретению состоит в том, что поисковый автомат могут преобразовывать в детерминированный конечный автомат в случае наличия неоднозначных переходов в общем конечном автомате.
Наконец, еще одна особенность способа по настоящему изобретению состоит в том, что синтаксический анализатор могут создавать с учетом контекста каждого из языков, используемых в подлежащих проверке документах, причем контекст языка содержит множество значимых символов этого языка. При этом в синтаксическом анализаторе могут реализовать оператор «.», обеспечивающий выдачу всех символов, которыми может оперировать конкретное регулярное выражение, либо оператор «х-у», обеспечивающий выдачу всех символов используемого языка, находящихся в конкретном регулярном выражении в последовательности символов, заключенной между символом «х» и символом «у».
Подробное описание изобретения
Настоящее изобретение может быть реализовано в любой вычислительной системе, например в персональном компьютере, на сервере и т.п. Для осуществления изобретения необходимо также наличие соответствующей базы данных, в которой хранятся электронные файлы текстовых документов.
Способ обнаружения текстовых объектов по настоящему изобретению предназначен для того, чтобы выделять из текстов анализируемых документов некоторые объекты, которые представляют собой структурированные сущности, описываемые посредством языка регулярных выражений. В результате пользователю должны выдаваться все строки из текста входного документа, удовлетворяющие шаблонам, заданным регулярными выражениями.
В способе по настоящему изобретению для каждого подлежащего обнаружению текстового объекта формируют список регулярных выражений, каждое из которых описывает данный текстовый объект. Текстовые объекты могут быть самыми разными, к примеру это может быть номер кредитной карты или дипломатического паспорта. Регулярное выражение определяется (см. Лапшин В.А. Лекции по математической лингвистике. - М.: Научный мир, 2010) индуктивно согласно следующим правилам:
1. Символ исходного алфавита является регулярным выражением, а также 8, обозначающая пустую цепочку.
2. Если R, R′ и R″ - регулярные выражения, то R′|R″, R′R″, R* и (R) - также регулярные выражения.
На практике еще применяются сокращения операторов. Например, [х-у]=х|х′|х″|…|у, т.е. альтернативу встречаемости всех символов в интервале [х; у], включая концы.
Простые примеры:
ab* - любой текст, начинающийся с символа а, за которым идет нуль или более символов b.
[a,c-e]?(ab)+ - любой текст, который начинается с необязательных (знак вопроса) символов a, c, d, e, за которыми идет нуль или более повторений строки ab.
21
21
Далее создают синтаксический анализатор, предназначенный для осуществления синтаксического анализа упомянутых регулярных выражений. Этот синтаксический анализатор представляет собой программу, которая проверяет, является ли переданное регулярное выражение правильно построенным или нет. Синтаксический анализатор создают с учетом контекста каждого из языков, используемых в подлежащих проверке документах, при этом упомянутый контекст языка содержит множество значимых символов этого языка. Например, в синтаксическом анализаторе могут быть реализованы оператор «х-у», обеспечивающий выдачу всех символов используемого языка, находящихся в конкретном регулярном выражении в последовательности символов, заключенной между символом «х» и символом «у», и оператор «.», обеспечивающий выдачу всех символов, которыми может оперировать конкретное регулярное выражение. Последний случай значим при работе с UNICODE, который содержит 2 символов. Оператор «.» обозначает любой символ, кроме символа окончания строки «\n». Если вместо точки вставить все 2 символов, то получится огромный автомат. Т.е. при анализе регулярного выражения необходимо еще знание о языках данного регулярного выражения и об их символьных наборах.
Затем на основе разобранного синтаксическим анализатором регулярного выражения генерируют индивидуальный конечный автомат для каждого упомянутого регулярного выражения. Каждый из этих автоматов является распознающим автоматом, т.е. он распознает, принадлежит ли конкретная строка языку данного регулярного выражения. Такое генерирование конечных автоматов можно осуществлять посредством стандартной процедуры (см., к примеру, информацию, размещенную на сайте http://citforum.edunet.kz/programming/theory/compiler/2.shtml). Полученные индивидуальные конечные автоматы для отдельных выражений объединяют (с помощью стандартного алгоритма объединения конечных автоматов) в поисковый автомат, предназначенный для поиска в тексте строк, заданных соответствующими регулярными выражениями. Этот поисковый автомат минимизируют относительно количества состояний для оптимального распознавания текстовых объектов. Если при объединении индивидуальных конечных автоматов были созданы неоднозначные переходы, объединенный общий конечный автомат преобразуют в детерминированный конечный автомат. Детерминированный автомат отличается от недетерминированного тем, что при чтении символа в первом имеется не более одного перехода в следующее состояние. Это свойство делает поиск быстрым, насколько это возможно. Способы такого преобразования см., например, в http://citforum.ru/programming/theory/serebryakov/3.shtml.
При поиске текстов регулярных выражений предпочтительно используется стратегия «жадного поиска». Например, если некое регулярное выражение описано как «а+», что означает повторение символа «а» один или несколько раз, а входной текст может содержать строку «ааааа», то в качестве результата могут выдаваться строки «а», «аа», «ааа» и т.д. В этом случае используют так называемый «жадный» алгоритм, который выделяет наиболее длинную строку, подходящую под указанное описание.
Кроме того, в предпочтительном варианте осуществления настоящего изобретения для каждого регулярного выражения (или, что то же, для каждого индивидуального конечного автомата) генерируют соответствующий инвертированный конечный автомат, каждый из которых предназначен для распознавания в обратном порядке соответствующего регулярного выражения в упомянутых текстовых объектах. Вместе с тем в предпочтительном варианте осуществления настоящего изобретения создают верификационные функции для проверки соответствия каждого из регулярных выражений установленным условиям. Верификация здесь - это запуск дополнительного алгоритма проверки структуры объекта, представленного данной найденной строкой. Например, для объектов типа «номер кредитной карты» необходимо дополнительно проверить, действительно ли найденный номер является номером кредитной карты. Для этого используется так называемый алгоритм Луна, т.е. известный алгоритм вычисления контрольной цифры номера пластиковых карт в соответствии со стандартом ISO/IEC 7812. Описать этот алгоритм на языке регулярных выражений невозможно, поэтому и используется алгоритм верификации как дополнительный фильтр для таких объектов.
Все конечные автоматы и функции верификации сохраняют в упомянутой выше базе данных в соответствующих файлах.
Запомненный в базе данных общий конечный автомат запускают на тексте подлежащего проверке документа для обнаружения в нем строк, содержащих упомянутые текстовые объекты (регулярные выражения). При обнаружении с помощью общего конечного автомата окончания каждой строки, содержащей какое-либо из упомянутых регулярных выражений, в предпочтительном варианте осуществления настоящего изобретения запускают соответствующий обнаруженному регулярному выражению инвертированный конечный автомат от обнаруженного окончания строки для нахождения начала строки, представляющей обнаруженное регулярное выражение.
Ниже приведен пример реализации способа обнаружения текстовых объектов по настоящему изобретению. Алгоритмы верификации в данном примере заданы на языке Python. Вообще, задание алгоритма на интерпретируемом языке (скрипте) представляет собой хороший способ привязать способ поиска объекта (регулярное выражение) к способу верификации (тексту соответствующей процедуры). Файл в этом примере позволяет обнаружить в тексте номер кредитной карты и дипломатического паспорта.
<?xml version=″1.0″?>
<objects>
<object пате="Кредитная карта">
<re langs="rus eng">
<name>credit_card</name>
<expression><![CDATA[^|[\r\n\t](?[0-9][\-*/]?){12,15}[0-9](?[\r\n\t,;.?!\:]|$)]]></expression>
<description>Номер кредитной карты</description>
<normal_form>%0</normal_form>
<verify_proc><![CDATA[
import string
defcheck(text):
separators=set([])
digits=[]
result=″″
for letter in text:
try:
iletter=int(letter)
digits.append(iletter)
result+=letter
except ValueError:
separators.add(letter)
if(len(separators)>1):
return False
iflen(digits)!=13 and len(digits)!=16:
return False
flag=0
iflen(digits)==13:
flag=1
sum=0
for pos,digit in enumerate(digits):
ifpos % 2==flag:
val=2digit
ifval>9:
val-=9
sum+=val
else:
sum+=digit
if sum % 10!=0:
return False
return result
]]></verify_proc>

</object>
<object name="Дипломатический паспорт">
<re langs="rus eng">
dip_passport_0
^
<expression><![CDATA[|[rn1]Д|дип(?w+|.)?
^
(?(?П|пacпopт)|(?P|passport)|(?P|pass.?))[0-9:](?[0-9]{2})(•?
?w{,7}(?:|)|№:?)?(?(?[0-9]?){7})(?[rnt,;.?!:]|$)]]></expression>
<normal_form>%0</normal_form>
<description></description>
<verify_proc><![CDATA[]]x/verify_proc>
</re>
<re langs="rus eng">
<name>dip_passport_1</name>
^
<expression><![CDATA[|[\r\n\t]Д|дип(?\w+|\.)?
^
*(?(?П|пacпopт)|(?P|passport)|(?P|pass\.?))[0-9:]**(?\w{,7}(?:|)|№:?)?
*(?(?[0-9]?){7})(?\w{,7}(?:|)|№:?)?*(?[0-9]{2})(?[
\r\n\t,;.?!\:]|$)]]></expression>
<normal_form>%0</normal_form>
<description></description>
<verify_proc><![CDATA[]]>
</verify_proc>

</object>
</objects>
Согласно этому примеру, для каждого объекта необходимо задать текстовое имя (name) и список регулярных выражений, по которым происходит обнаружение этого объекта. Для каждого регулярного выражения (секция ) указывается через пробел список языков (langs), уникальный текстовый идентификатор (name), текст регулярного выражения (expression), нормальная форма (normal_form), произвольное текстовое описание (description) и функция верификации (verify_proc).
На основе файла с объектами:
строят автоматы всех регулярных выражений,
строят НКА (недетерминированные конечные автоматы),
по НКА строят ДКА (детерминированные конечные автоматы),
ДКА преобразуют в поисковые автоматы,
некоторые (все) автоматы «сливаются» (случай, когда все автоматы сливаются, по сути является более общим случаем «построения общего поискового автомата». Использование подхода, при котором результатом «слияния» оказывается не один, а несколько автоматов, связано с тем, что при построении одного поискового автомата рост количества неоднозначностей (альтернатив) приводит к экспоненциальному росту количества состояний результирующего автомата),
сохраняют на диск полученные после слияния поисковые и инвертированные автоматы.
Поиск в тексте осуществляется поисковым автоматом, построенным на основе регулярных выражений объектов. Результатом поиска является список всех вхождений объектов во входную последовательность. Для каждого вхождения задают:
текстовое имя объекта,
идентификатор регулярного выражения, по которому было совпадение,
начальная позиция в тексте,
длина в символах,
нормальная форма (канонический вид). Длина нормальной формы не обязательно равна длине части текста, соответствующей объекту, поскольку в процессе нормализации лишние символы, разделители могут быть опущены.
Например, пусть на вход системы, в которой реализован способ по настоящему изобретению, пришла последовательность «4000000000006300 89 №78 9 9 998 4000-0000-0000-6». Регулярным выражениям удовлетворяют подстроки «4000000000006300», « 89 №78 9 9 998 » и « 4000-0000-0000-6». Для каждой из строк вызывается соответствующая функция верификации (если она есть). Строка «4000000000006300» удовлетворяет регулярному выражению для номера кредитной карты, но не проходит верификацию (неверная контрольная сумма). Остальные строки верификацию проходят. В итоге после нормализации получаем найденные объекты:
Дипломатический паспорт - 897899998
Кредитная карта - 4000000000006
Здесь для обнаружения номера кредитных карт используется регулярное выражение [^nrt:]([0-9][Λ-]?){12,15}[0-9] $|[,;:.?!]?[\n\r\t]. В этом выражении первая часть [^\n\r\t:] представляет собой маркер начала текстового объекта. Эта часть означает, что детектируют номер кредитной карты, только если перед ним стоит символ переноса строки, пробел, табуляция, двоеточие, или же объект находится в начале файла (сообщения, выделенного текста и т.д.). Для описания начала потока на языке регулярных выражений используется символ ^.
Следующая часть ([0-9][Λ-]?){12,15}[0-9] представляет собой непосредственно номер кредитной карты. Регулярное выражение описывает строки, содержащие от 13 до 16 цифр включительно, причем между двумя любыми символами может быть один из разделителей - пробел, дефис или слэш.
Завершающая часть $|[„:.?!]?[nrt] представляет собой маркер окончания текстового объекта. Аналогично маркеру начала, этот маркер окончания означает, что номер кредитной карты должен находиться в конце файла (символ $), или же после него должен идти символ переноса строки, табуляция, перенос каретки, пробел или какой-либо из знаков пунктуации ([,;:.?!]?).
Все объекты, найденные по регулярному выражению, проходят процедуру верификации. Для номеров кредитных карт проверяют однородность разделителей (между цифрами должен быть один и тот же разделитель), группирование цифр (примерами корректного группирования являются: ХХХХХХХХХХХХХХХХ, ХХХХ-ХХХХ-ХХХХ-ХХХХ, ХХХХ ХХХХ ХХХХ X). Помимо этого проверяется контрольная сумма цифр кредитной карты в соответствии с ISO/IEC 7812.
Понятно, что приведенный пример служит лишь иллюстративным целям.
Таким образом, способ обнаружения текстовых объектов по настоящему изобретению обеспечивает расширение арсенала технических средств и позволяет сравнительно быстро обнаруживать в каком-либо документе регулярные выражения, преодолевая тем самым недостатки известных решений.