- •1.О языке обработки текста aql
- •2.Требования к обучаемому
- •3.Цели и задачи лабораторной работы
- •4.Сценарий лабораторной работы
- •Раздел 1: Импорт входных документов и словарей
- •Раздел 2: Маркировка ключевых слов в тексте
- •Раздел 3: Разработка экстрактора (aql)
- •Раздел 4: Тестирование экстрактора (aql)
- •Раздел 5: Изучение инструментов
- •Раздел 6: Экспорт результатов
- •5.Подготовка к лабораторной работе
- •7.1.Маркировка фрагментов текста
- •8.Раздел 3: Разработка экстрактора
- •Используя Package Explorer переместите папку dictionaries в
- •9.Раздел 4: Тестирование экстрактора
- •Столбец Span Attribute в центре окна Annotation Explorer показывает имена подразделений, извлеченные экстрактором.
- •9.2.Разработка основных экстракторов для Number, Unit и Revenue
- •9.2.1.В Extraction Plan переместитесь к RevenueByDivision → Labels → Amount. Щелкните правой кнопкой по New aql Statement и выберите Basic Feature aql Statement.
- •9.2.2.В диалоговом окне Create aql Statement введите "Number" как View Name и выберете Regular Expression как type.
- •9.2.3.Необходимо исправить следующие ошибки:
- •9.2.4.Выполните шаги, описанные в прошлом разделе и заполните диалоговое окно для “Create aql Statement”.
- •9.2.6.Обновите шаблон для ‘create view unit’, добавьте флаг следующим образом: “with flags 'IgnoreCase’ ” между строками extract и on
- •9.2.7.Переместитесь в RevenueByDivision → Labels → Revenue. Щелкните правой кнопкой по Revenue и выберите New aql Statement. Выберите Basic Features aql statement.
- •9.2.8.Выполните шаги, утвержденные в прошлом разделе и заполните диалоговое окно для “Create aql Statement”.
- •9.2.10.На данном этапе Extraction Plan должен выглядеть следующим образом:
- •9.3.Разработка дополнительных экстракторов
- •9.4.5.Теперь эти представления могут быть использованы в текущем модуле для экстрактора AmountwithUnit. Переместитесь к aql скрипту этого экстрактора.
- •9.4.6.Добавьте следующие строки кода в самом начале, сразу после названия модуля, для RevenueByDivision_CandidateGeneration, чтобы импортировать требуемые представления в текущий модуль.
- •9.6.Расширение экстрактора для RevenueByDivision: включение информации AmountwithUnit
- •Вернитесь в терминал и запустите браузер командой firefox
- •12.Результаты
9.4.5.Теперь эти представления могут быть использованы в текущем модуле для экстрактора AmountwithUnit. Переместитесь к aql скрипту этого экстрактора.
9.4.6.Добавьте следующие строки кода в самом начале, сразу после названия модуля, для RevenueByDivision_CandidateGeneration, чтобы импортировать требуемые представления в текущий модуль.
module RevenueByDivision_CandidateGeneration;
--<add the following lines>
import view Number from module RevenueByDivision_BasicFeatures as Num;
import view Unit from module RevenueByDivision_BasicFeatures as Quant;
|
Примечание Оператор импорта помещает объекты в контекст текущего модуля. Оператор импорта используется только, чтобы импортировать объекты из других модулей. Помните, что объект объявленный в файле AQL определенного модуля, будет доступен любому другому файлу AQL в том же самом модуле. |
9.4.7.После импорта исправьте строку ‘from’, присваивающую переменные N и U к алиасам Num и Quant, которые мы создали для представлений Number и Unit. Далее измените шаблон, чтобы искать в тексте символ $, сопровождаемый числом и единицей измерения. (‘$’ <N.match> <U.match>). В результате экстрактор будет выглядеть следующим образом:
create view AmountWithUnit as
extract pattern '$'<N.match> <U.match>
return group 0 as match
from Num N, Quant U;
output view AmountWithUnit;
9.4.8.Запустите экстрактор, перейдите к Extraction Tasks и выберите Step 4.a в Extraction Tasks (3-я опция "Run the extraction plan on the set of documents that are labeled"). Вы увидите результат в окне Annotation Explorer. Дважды щелкните по строке в Annotation Explorer, чтобы увидеть панель справа и установить флажок для AmountWithUnit.
Рис.57 – Результаты для экстрактора AmountwithUnit, последовательное размещение числового значения после единицы измерения
9.5.Создание экстрактора для RevenueByDivision
Добавьте правило Candidate Generations для RevenueByDivision, чтобы можно было идентифицировать имя подразделения (Division), сопровождаемого упоминанием о его доходе (Revenue), с определенным разрывов в словах между ними. Например:
Global Financing segment revenues
Software segment revenues
Мы будем использовать оператор AQL Select следующим образом:
9.5.1.В Extraction Plan перейдите к RevenueByDivision и щелкните правой кнопкой по нему. Выберите New AQL statement и пункт Candidate Generation AQL Statement.
9.5.2.В диалоговом окне введите RevenueOfDivision1 для View Name и AQL script. Выберите Select в качестве Type. Вы можете оставить опцию 'output view' неотмеченной. Вы получите следующий шаблон AQL:
create view RevenueOfDivision1 as
select <name>
into <output view name>
from <arguments>
9.5.3.Измените output на export для Revenue и Division, чтобы экспортировать представление в другой модуль.
9.5.4.Импортируйте представления в текущий файл для RevenueOfDivision1, добавив следующие две строки кода в самом начале aql-файла, сразу после названия.
import view Revenue from module RevenueByDivision_BasicFeatures as Rev;
import view Division from module RevenueByDivision_BasicFeatures as Div;
9.5.5.Для оператора Select мы хотим выбрать промежуток, который комбинирует промежутки Division и Revenue в разных порядках, объединив промежутки и отметив их как соответствующие. Далее от объединенного промежутка мы выбираем требуемое имя подразделения.
select CombineSpans(D.match, R.match) as match, D.match as division
9.5.6.Чтобы удостовериться, что название подразделения и доход используются в одном выражении рядом друг с другом, мы добавляем следующий оператор:
where FollowsTok(D.match, R.match, 0,1);
9.5.7.В результате код должен выглядеть так:
create view RevenueOfDivision1 as
select CombineSpans(D.match, R.match) as match, D.match as division
from Rev R, Div D
where FollowsTok(D.match, R.match, 0,1);
Добавьте еще одно правило Candidate Generation с именем “RevenueOfDivision2”, на основе шаблона “Revenue for (from) … Division”, который ищет фрагмент текста с двумя или менее словами между словами “for” (или “from”) и названием подразделения. Например: “Revenues from the Systems and Technology Group (S&TG) segment” (В данном случае – одно слово the между from и названием подразделения).
9.5.8.В Extraction Plan щелкните правой кнопкой по RevenueByDivision New AQL Statement. И выберите Candidate Generation AQL Statement.
9.5.9.В диалоговом окне введите RevenueOfDivision2 для View/AQL script Name и выберите Pattern в качестве Type. Вы можете оставить опцию ‘output view’ неотмеченной.
create view RevenueOfDivision2 as
extract pattern <pattern specification>
return group 0 as match
from <list of input views> ;
9.5.10.Спецификация шаблона имеет тот же синтаксис, что и AmountwithUnit с добавлением проверки на «разрывы» между словами. Для этого в коде используется: ‘<Token> {0,2}’. (Между словами с меткой Revenue и меткой Division – не более двух слов.)
9.5.11.Заключительный код будет выглядеть следующим образом:
create view RevenueOfDivision2 as
extract pattern <R.match> ('from'|'for') <Token>{0,2} (<D.match>)
return group 0 as match and group 2 as division
from Rev R, Div D;
9.5.12.Добавьте правило Union All Rule для объединения результатов RevenueOfDivision1 и RevenueOfDivision2.
В Extraction Plan щелкните правой кнопкой по RevenueByDivision и выберите New AQL Statement -> Candidate Generation AQL Statement. В открывшемся диалоговом окне введите следующие данные:
RevenueByDivision для View/Script Name,
Выберите Union All в качестве Type,
Поставьте флажок на опции ‘output view'.
В результате шаблон для RevenueByDivision.aql должен выглядеть следующим образом:
create view RevenueByDivision as
(select <name 1> from <input view 1>)
union all
(select <name 2> from <input view 2>);
output view RevenueByDivision;
9.5.13.Два входных имени представления (<input view>) - RevenuebyDivision1 и RevenuebyDivision2, таким образом, в результате код экстрактора должен быть таким:
create view RevenueByDivision as
(select R1.* from RevenueOfDivision1 R1)
union all
(select R2.* from RevenueOfDivision2 R2);
output view RevenueByDivision;
Используя данное представление, объединяются результаты RevenueOfDivision1 и RevenueOfDivision2.
|
Вопрос № 4: Какой оператор используется для объединения представлений? ________________________________________________________ |
Теперь, ваш Extraction Plan должен выглядеть следующим образом:
Рис. 58 – Сгенерированные candidates для экстрактора RevenueByDivision
9.5.14.В Extraction Tasks выберите Step 4: Test the Extractor, выберите последний пункт - Run the extraction plan on the set of documents that are labeled и щелкните по значку рядом с ним. Вы увидите информацию – имена подразделений и их доходы как показано ниже.
|
Примечание Выберите match (SPAN) для Division и Revenue в окне справа, чтобы подсветить извлеченный текст. |
Рис.59– Визуализация извлеченных объектов RevenueByDivision и AmountWithUnit.
В красной области на рисунке выделены недостающие ассоциации между названиями подразделений и их доходами. Это будет устранено на следующем этапе. Ключом для этой ассоциации является то, что между суммой дохода и названием подразделения имеется несколько слов.
