Pascal ile Metinleri parçalarına ayrıştırmak
- 10 Ekim 2006 Salı
- Uğur Parlayan
Uzmanları bilir, aşağıdakiler bu tür işlerle uğraşan programcıların vakıf olduğu bir konudur. 'Parse etmek' olarak tabir edilen işlem aslında bir metindeki her bir kelimeyi teker teker ele almak demektir.
Aşağıdaki fonksiyon Delphi Programlama ortamı ile birlikte sunulan fakat belgelendirilmemiş bir nesne olan TPARSER ile aynı işlevi yerine getirir.
Mensubu olduğum meslek grubundaki insanlar tarafından bilinen fakat pek halka ulaşmayan konulardan birisi de 'Doğal dil işleme' dir. Bu konu hem akademik hem de ticari alanlardaki cazibesini gün geçtikçe artırıyor.
Bu ihtiyaca sadece Doğal dil işleme çalışmaları açısından da bakılmamalı. Bu konu, yani metni kelimelere ayrıştırma işi Türkçe ile hem teknik hem de akademik açıdan uğraşan bir çok kişi için önemli ve gerekli bir konu.
Burada tanıtacağım fonksiyon Pascal dilinde yazıldı ve Delphi programlama ortamında geliştirildi. Kısaca fonksiyon, verilen bir metin içinden sırayla her bir kelimeyi alıp kullanıcıya gösteriyor. Işık yakması açısından eğer betik dili geliştirmek veya basit komutları algılayarak belli işleri belli kelimelere bağlamak istiyorsanız bu fonksiyon çok işinize yarayacaktır diye umuyorum...
Function Kelime(Paragraf: String; {dışa aktarmak için -->} VAR Basamak: Integer):String;
var
Harf :Char;
LAF :String;
Boy :Integer;
begin
Paragraf := Trim(Paragraf);
Boy := Length(Paragraf);
if (Basamak > Boy)
or ((Paragraf = '') and (Boy = 0)) then begin
Result := '';
Exit;
end else begin
Repeat
Harf := Paragraf[Basamak]; {<- Her bir basamaktaki her bir harfi tek tek ele aliyoruz.}
LAF := LAF + harf; {<- Harfleri LAF adli bir degiskende biriktiriyoruz.}
Basamak:= Basamak + 1; {<- Harfi aldigimiz basamagin numarasini 1 artiriyoruz.}
Until (Harf in [' ',#10]) { <- Bosluk veya alt satira geçis varsa,}
or (Basamak = Boy + 1); { veya cümlenin sonuna gelinmisse döngüden çikiyoruz }
if (LAF > '') then begin { <- Eger LAF degiskeni dolu ise }
Result := Trim(LAF) { <- Sonuc = LAF}
end else begin
Result := ''; { <- LAF degiskeni bos ise sonuç = bos}
end;
end;
end;
Örnek Uygulama ve Kullanımı
Unit Unit1;
interface
uses Windows, Messages, SysUtils, variants, Classes, Graphics,
Controls, Forms, Dialogs;
type TForm1 = Class(TForm)
Procedure FormCreate(Sender: TObject);
public
Function Kelime(Paragraf: String; VAR Basamak: Integer):String;
end;
var Form1: TForm1;
implementation {$R *.dfm}
{ Bu fonksiyon verilen string içindeki her bir kelimeyi size teker teker verecek }
Function TForm1.Kelime(Paragraf: String; VAR Basamak: Integer):String;
var
Harf :Char;
LAF :String;
Boy :Integer;
begin
Paragraf := Trim(Paragraf);
Boy := Length(Paragraf);
if (Basamak > Boy)
or ((Paragraf = '') and (Boy = 0)) then begin Result := '';
Exit;
end else begin
Repeat
Harf := Paragraf[Basamak]; { <- Her bir basamaktaki her bir harfi tek tek ele aliyoruz.}
LAF := LAF + harf; { <- Harfleri LAF adli bir degiskende biriktiriyoruz.}
Basamak := Basamak + 1; { <- Harfi aldigimiz basamagin numarasini 1 artiriyoruz.}
Until (Harf in [' ',#10]) { <- Bosluk veya alt satira geçis varsa,}
or (Basamak = Boy + 1); { veya cümlenin sonuna gelinmisse döngüden çikiyoruz }
if (LAF > '') then begin { <- Eger LAF degiskeni dolu ise }
Result := Trim(LAF) { <- Sonuc = LAF}
end else begin
Result := ''; { <- LAF degiskeni bos ise sonuç = bos}
end;
end;
end;
// Burada da nasıl kullanıldığı ile ilgili bir örnek bulunmakta.
Procedure TForm1.FormCreate(Sender: TObject);
var
AtaSozu,
GelenKelime : string;
Yer : integer;
begin
AtaSozu := 'Bir elin nesi var iki elin sesi var.';
Yer := 0;
while (Yer < length(AtaSozu)) do begin
GelenKelime := trim(kelime(AtaSozu, yer));
ShowMessage(GelenKelime);
end;
{veya baska bir cümle daha çözümleyelim;}
AtaSozu := 'Sanmak hatalarin anasidir!';
Yer := 0;
while (Yer < length(AtaSozu)) do begin
GelenKelime := trim(kelime(AtaSozu, yer));
ShowMessage(GelenKelime);
end;
end;