Son günlerde üzerinde çalıştığım bir projede Text Mining ile ilgili daha derin araştırmalar yapmaya ihtiyaç duyuyorum. İngilizcede Stop words elemek çok kolay, çünkü  büyük-küçük harf duyarlığı devre dışı kaldıktan sonra hiç bir programlama dilinde kelimeyi yakalama ihtimaliniz düşmez. Bu Türkçe için böyle değildir. Türkçe karakterler bazı programlama dillerinde özel işlemler gerektirebiliyor. örn php Mutlibyte String eklentisini sunuyor. işlemlerimizi bu kütüphane ile yaptığımız sürece unicode sorunu yaşamıyoruz. mb_string eklentisinin kurulumu için  şurayı ziyaret edebilirsiniz.Multibyte işlemler dışında yine istisnai durumlarımız olabildiği için bu eklentiği kullanmadan regular expression yardımıyla bir filter hazırladım. bu kütüphanemizin de programlanabilmesini sağladı ve tadından yenmez oldu. şimdi bir örnek verelim. Elemek istediğimiz kelime “bir” olsun. büyük-küçük harf duyarlılığını kaldırdığımızda  “BIR” kelimesi de elenecektir. Türkçede bu kelimeler aynı değil! bir ve BİR aynı olabilir ancak. Her kelime için ayrı bir istisna sinsilesi olabileceği için ben de regexpe başvurdum.

Statik Stopwords Datamız:

0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
 class stopWords
    {
        public static $stopwords = array(
        'il[ae]',
        'ke[sş]ke',
        'z?([haeiu][haeiu]?)+',
        'mal',
        'aptal',
        'https?\:\/\/[^\s\"\<]+',
        'B[iİ]r',
        'the',
        'g[o]+l',
        'you',
        '[İi][cç]in',
        'his',
        'ilk',
        'iyi',
        'and',
        '[cç]ok',
        'yok',
        'gibi',
        'ama',
        'ma[çc]',
        'her',
        'var',
        'bizim'
        );
 
        public static function FILTER_STOP_WORDS($word)
        {
            foreach(self::$stopwords as $pattern)
            {
                if(preg_match('/^' . $pattern . '$/i',$word))
                {
                    return false;
                }
            }
            return true;
        }
    }
# 3. elemanımız çok komik her gülmeyi yakaladı, dışında kalan birşey bulamadım (: (örnek : zuahaha zhhhh zihihi hiihi haah eheheh ahehehaeh ) bunların hepsini silebildim.

Elbette liste bununla sınırlı değil siz geliştirip , gruplandırıp desenler arttırabilirsiniz bir metin filtreleme örneği de verelim

0
1
2
3
4
     $text = "Tufan attı ve goooooooooooool hahahaha zuahaha ";
    $words = explode(' ',$text);
    $words = array_filter($words,'stopWords::FILTER_STOP_WORDS');
    $text = implode(' ',$words);
   # cıktı : "Tufan attı"

gol kelimesini ben eledim projemde bilgidğin stop word kategorisine giriyor bu (: siz özelleştirip gelitşirebilirsiinz
iyi çalışmalar,

oracle regexp yeteneklerini kullanarak to_date fonksiyonunda hata verecek tarihleri önceden tespit edip hataya düşmeden null olarak dönmesini sağladık . önce fonksiyonu  vereyim sonrasında bi cümlem daha olacak (:

0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
CREATE OR REPLACE FUNCTION to_date2(txt IN VARCHAR2,Format IN Varchar2:='DD.MM.YYYY')
   RETURN VARCHAR2
IS
   Gun   INT;
   Ay    INT;
   Yil   INT;
BEGIN
   IF REGEXP_LIKE (
         txt,
         '(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.]((19|20)\d\d)'
      )
   THEN
      Gun :=
         TO_NUMBER(REGEXP_REPLACE (
                      txt,
                      '(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.]((19|20)\d\d)',
                      '\1'
                   ));
      Ay :=
         TO_NUMBER(REGEXP_REPLACE (
                      txt,
                      '(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.]((19|20)\d\d)',
                      '\2'
                   ));
      Yil :=
         TO_NUMBER(REGEXP_REPLACE (
                      txt,
                      '(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.]((19|20)\d\d)',
                      '\3'
                   ));
 
      IF MOD (Yil, 4) = 0
      THEN
         IF (Ay = 2 AND Gun > 29)
         THEN
            RETURN NULL;
         END IF;
      ELSIF (Ay = 2 AND Gun > 28)
      THEN
         RETURN NULL;
      END IF;
 
      IF (Ay <= 7)
      THEN
         IF (MOD (Ay, 2) = 1 AND Gun > 31) OR (MOD (Ay, 2) = 0 AND Gun > 30)
         THEN
            RETURN NULL;
         END IF;
      ELSIF (Ay > 7)
      THEN
         IF (MOD (Ay, 2) = 0 AND Gun > 31) OR (MOD (Ay, 2) = 1 AND Gun > 30)
         THEN
            RETURN NULL;
         END IF;
      END IF;
      RETURN TO_CHAR (to_date(Gun||'.'||Ay||'.'Yil),Format);
   END IF;
 
   RETURN NULL;
END;
/

bunlar yerine to_date ve to_char fonksiyonlarını içeren bir fonskiyonla hata yakalandığında null dön diyebilirdik . fonksiyonun tek yaptığı 01/10.2009 gibi farklı işaretler kullanıldığında da ayırabilmek (: ama madem bu kadar uğraştım yayınliim dedim (:

iyi çalışmalar

Bu aralar regex ile devam ediyorum. bugun oracleda ihtiyacım oldu düzenli ifadelere kullanırken aklıma geldi bloguma da eklim dedim.

Oracle Regex Fonksiyonları : 

Fonksiyon Açıklama
REGEXP_LIKE LIKE gibi çalışır ama katar tanımlamanıza olanak sağlar.
REGEXP_INSTR Katara uyan ilk eşleşmenin ilk karakterinin indisi olarak döner.
REGEXP_REPLACE Klasik Regexp replace işi yapar.
REGEXP_SUBSTR Katara eşleşen metin olarak döner.

 Örnekler :

REGEXP_LIKE :

0
SELECT *FROM HASTALAR WHERE  REGEXP_LIKE(HASTA_ADI,'([A-Z]+)','c');

ilk parametremiz arama yapacağımız alan ya da metnin kendisi, ikincisi katar görüntüsü üçüncü parametremiz de regex ayarları oluyor.

Bu sorgunun sonucunda bize sadece büyük harflerden oluşmuş isimler gelir.

Regex Ayarları: 

Fonksiyon Açıklama
c Büyük küçük harf duyarlı eşleşme (varsayılan)
i Büyük küçük harfe duyarsız eşleşme
n “match-any-character” ayarını açar. (sadece acıkken nokta satır sonu ile de eşleşir)
m multiline ayarı (:

REGEXP_INSTR:

 

0
SELECT REGEXP_INSTR('TUFAN BARIS YILDIRIM 123','([0-9]+)') FROM DUAL

sorgu sonucunda katara ilk eşleşen kısım “123″ olacağından ilk karakterinin yani ” 1″ in indisi  yani 25 sonucunu alırız

REGEXP_SUBSTR

 

0
SELECT REGEXP_SUBSTR('TUFAN BARIS YILDIRIM 123','([0-9]+)') FROM DUAL

sorgu sonucunda katara ilk eşleşen kısım “123″ olacağından bize 123 olarak döner. ilk eşleşmeden sonrakileri almak istiyorsak regexp_replace kullanrız.

REGEXP_REPLACE

 

0
SELECT REGEXP_REPLACE('TUFAN BARIS YILDIRIM 123','([A-Z]+)([\s]+)([0-9]+)','rakamlardan onceki son kelime : \1') FROM DUAL

sorguda ilk önce katarı  inceleyelim  3 gruptan oluşuyor ilk grubumuz büyük harf(ler) ikincisi boşluk(lar) üçüncü grubumuz rakam(lar) replace işleminde kullandığımız \1  eşleşen grubun indisin belirtir bulduğumuz sonucu ilk grup ile değiştirip cıktı olark alıyoruz.  eşleşen grup  “YILDIRIM 123″  olur  replace işleminde  ilk grubu yerine yazarsak bize
“rakamlardan önceki son kelime : YILDIRIM” diye döner.

bi dahaki regex ya da oracle yazımızda görüşürz inş  iyi çalışmalar..

regexper.exe küçük birşey gibi görünse de buna daha yapılacak çook şey olduğuna inanıyorum. yazdığınız metinde regexp ile replace özelliği “phpdeki preg_replace  fonksiyonu gibi” ekledim yine renklerle destekledim her katar grubu için bir renk ve onu temsil eden sıra numarasıyle ” $1 gibi” istediğiniz replace olayını yaptırabilirisiniz.

 

Resme Tıklayarak yeni sürümü indirebilirsinizRegexp Replace

© 2012 Tufan Suffusion theme by Sayontan Sinha