2015-01-22 3 views
0

По существу, чтобы перейти от foo\tbar\tbaz на каждой строке ввода в 'bar'('foo', 'baz').Возьмите три вкладки разделены маркеры и сделать Пролог «факт»

Если какой-либо из маркеров содержит апостроф, она должна быть замаскирована обратной косой чертой :

don't ->'don\'t'

Деталь:

у меня есть файл, полный 'полуструктурированная' компонента предложения формы:

the grand hall of the hong kong convention attend by some # guests 
principal representatives of both countries seat on the central dais 
representing china be mr jiang 
britain be hrh 
the principal representatives be more than # distinguished guests 
hong kong end with the playing of the british national anthem 
this follow at the stroke of midnight 
both countries take part in the ceremony 
the ceremony start at about # pm 
the ceremony end about # am 
# royal hong kong police officers lower the british hong kong flag 
another # raise the sar flag 
the # leave for the royal yacht britannia 
the handover of hong kong hold by the chinese and british governments 
the world cast eye on hong kong 
the # governments hold on schedule 
this be festival for the chinese nation 
july # , # go in the annals of history 
the hong kong compatriots become master of this chinese land 
hong kong enter era of development 
history remember mr deng xiaoping 
it be along the course 
we resolve the hong kong question 
i wish to express thanks to all the personages 
both china and britain contribute to the settlement of the hong kong 
the world support hong kong 's return 
i wish to extend my cordial greetings and best wishes 

Как вы можете видеть, они разделены вкладками. То, что я хочу сделать, это создать нормальные определенные положения из этих данных, что делает их, как:

'attend by'('some # guests','the grand hall of the hong kong convention'). 
'take part in'('the ceremony','both countries'). 
be('representing china', 'mr jiang'). 

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

Надеюсь, что в конечном итоге их можно будет использовать в Prolog.

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

Я предполагаю, что есть какой-то причудливый сценарий perl или регулярное выражение, sed, тип операции, который может достичь этого наиболее эффективно. Мне нужно выполнить это в массивном файле, поэтому я ищу оптимизацию для эффективности, поэтому я его представляю здесь.

+0

ли случайно, что 'be' не в кавычках, или должны лексемы, которые содержат не пробелы без кавычек? – Wintermute

+0

aha, хорошее наблюдение, я не знаю, как вы думаете? возможно, для непрерывности все должно быть указано? –

ответ

1

С СЕПГОМ:

sed "s/\(.*\)\t\(.*\)\t\(.*\)/'\2'('\3', '\1')/" filename 

Чтобы сохранить маркера без пробелов в них без кавычек, было бы проще использовать AWK:

awk -F\\t -vq="'" 'function quote(token) { if(index(token, " ")) { return q token q }; return token } { print quote($2) "(" quote($3) ", " quote($1) ")" }' filename 

Что касается Perfomance, я подозреваю, что узкое место будет I/O, а не эта программа. Если это окажется проблемой, вы не захотите возиться со скриптовыми языками и сбить 20 строк C++.

EDIT: В ответ на замечания (что я знаю о прологе, а: Р), всегда цитаты и цитаты апостроф в кавычки, AWK проще снова:

awk -F\\t -vq="'" 'function quote(token) { gsub(q, "\\"q, token); return q token q } { print quote($2) "(" quote($3) ", " quote($1) ")" }' filename 

Но также возможно с СЕПГ:

sed "s/'/\\\\'/g;s/\(.*\)\t\(.*\)\t\(.*\)/'\2'('\3', '\1')/" filename 

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

Обратите внимание, что для решения sed требуется наличие двух вкладок в каждой строке. Глядя на тестовый ввод, я не совсем уверен, что это так, поэтому awk может стать для вас лучшей ставкой.

+0

Хороший ответ (+1), но для Prolog, это не только пробелы, которые заставят токены процитировать. Лучше (и проще) всегда указывать, но избегать одиночной кавычки с помощью обратной косой черты, которую ваш скрипт не делает в данный момент. –

+0

Думаю, возможно, сохранить их с единственными кавычками, для непрерывности. Этот скрипт работает как шарм, и это так быстро! @Boris Я в замешательстве относительно того, что вы говорите в отношении одинарных кавычек, вы думаете лучше использовать двойную кавычку? –

+0

@ user3787253 Я думаю, что лучше познакомиться с Prolog хотя бы немного, прежде чем продолжить, потому что иначе это будет сложно. –

0

В SWI-Prolog, рассмотрим tokenize_atom/2 (вам необходима последняя версия, чтобы иметь возможность поместить в исходных произвольных длинных текстовых констант, и процитировать «)

t :- Text = ' 
the grand hall of the hong kong convention attend by some # guests 
principal representatives of both countries seat on the central dais 
... rest of text... 
the world support hong kong \'s return 
i wish to extend my cordial greetings and best wishes', 
tokenize_atom(Text,L), maplist(writeln,L). 

дает

?- t. 
the 
grand 
hall 
of 
the 
hong 
kong 
... 

, чтобы вы могли использовать DCG для «понимания» текста. Это гораздо проще, чем прохождение через внешние инструменты, я думаю ... код Бориса комментарий

редактировать ДАВАЙТЕ:

file_2_statements(File) :- 
    atom_codes('\t', Tab), 
    open(File, read, S), 
    repeat, 
    read_line_to_codes(S, L), 
    ( L \= end_of_file 
    -> append([H,Tab,A1,Tab,A2], L), 
     maplist(atom_codes, [Hc,Ac1,Ac2], [H,A1,A2]), 
     P =.. [Hc,Ac1,Ac2], assert(P), 
     fail 
    ; true 
    ), 
    close(S). 
+0

Некоторые пробелы - это пробел, некоторые из его вкладок, которые действуют как разделители между точно тремя полями. Было бы, вероятно, легче читать по строкам, разделить каждый на вкладках, чтобы сделать три атома, и использовать '= ..' для выполнения условий. –

+0

спасибо, я не читал с достаточным вниманием спецификации. – CapelliC

+0

Мне пришлось отредактировать вопрос, потому что OP не может сформулировать его правильно самостоятельно. –

Смежные вопросы