Halâ Tasarım Aşamasında !
.com
Türkçe, Delphi ve SQL konusundaki deneyimler, örnek kodlar, eleştiri ve düşünceler...

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;

Hatırlatma

Bu sayfa test aşamasında olup deneysel veriler içermektedir.

EkleBunu Sosyal Paylaşım Butonu

Cıvıltılar

  • Herkes aynı fikirdeyse, hiç kimse yeterince düşünmüyor demektir
  • Beleş malın ömrü kısa olur
  • Bütün mucitler tembel olsaydı cilalıtaş devrine yeni girmiştik...
  • Çaresizlik insana icat yaptırır...
  • Yüzyılın Soykırımı
  • Sparkfun elektronik 7 Ocak 2010'da 1000 kişiye 100$ değerinde hediye dağıtacakmış...
  • Muharrem Ankara'da işbaşı yaptı, kendisine başarılı ve müreffeh bir iş hayatı diliyoruz :)
  • Erhan'a da huzurlu ve mutlu bir ömür diliyoruz.
  • MikroPascal'ın LCD kütüphanesinde ne tür bir sorun olabilir AÇAPAAAA! Nerede bu kodlar, nerede bu kaynak kodlar !!!

Sayfa Seç

1
Toplam 1 sayfa var. Siz 1. sayfadasınız ve 1 kayıt içinden 1 ile 1 arasını görmektesiniz

Yazı Miktarı

Bu sayfada kaç adet yazı görmek istiyorsunuz? Aşağıdakilerden birini seçiniz
1 2 3 5 10 15 20 30 50 75 100 200 300