Archive | PHP RSS feed for this section

symfony1.4でDeprecated: preg_replace() このエントリーをはてなブックマークに追加

7 10月

PHPのバージョンを上げると、preg_replace関数でe修飾子を使っていることが非推奨!と怒られます。

symfony1.4ではいくつかe修飾子を使っている部分があり、検索するとPHP5.5系でも使い続けられるよう、lib/vendorのいくつかのファイルを修正する方法が見つかります。

でも、見つかった記事に間違いがあるのか(なんかドメインがczだったのでチェコスロバキア語?ちょっと読めないページで見つけた)、たとえばuser_idというカラムを持ったモデルをdoctrine:build-modelすると、baseクラスがgetUser_idみたいなメソッドを生成するのが気持ち悪いです。getUserIdにしてほしい!

なので、修正したコードを掲載します。多分あっていると思うんですけど。。どうもこの、一番最後に追加したsfToolKitのcamelizeメソッドにミスがあるみたいなんですね。間違ってたら教えて下さい。

パッチファイル:pregFix_for_sf14

lib/vendor/symfony/lib/command/sfCommandManager.class.php

@@ -108,7 +108,9 @@ class sfCommandManager
else if (!is_array($arguments))
{
// hack to split arguments with spaces : --test="with some spaces"
- $arguments = preg_replace('/(\'|")(.+?)\\1/e', "str_replace(' ', '=PLACEHOLDER=', '\\2')", $arguments);
+ $arguments = preg_replace_callback('/(\'|")(.+?)\\1/', function($matches) {
+ return str_replace(' ', '=PLACEHOLDER=', $matches[2]);
+ }, $arguments);
$arguments = preg_split('/\s+/', $arguments);
$arguments = str_replace('=PLACEHOLDER=', ' ', $arguments);
}

lib/vendor/symfony/lib/form/addon/sfFormObject.class.php

@@ -278,6 +278,6 @@ abstract class sfFormObject extends BaseForm
protected function camelize($text)
{
- return preg_replace(array('#/(.?)#e', '/(^|_|-)+(.)/e'), array("'::'.strtoupper('\\1')", "strtoupper('\\2')"), $text);
+ return sfToolkit::camelize($text);
}

lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/form/sfFormFilterDoctrine.class.php

@@ -323,7 +323,7 @@ abstract class sfFormFilterDoctrine extends sfFormFilter
protected function camelize($text)
{
- return sfToolkit::pregtr($text, array('#/(.?)#e' => "'::'.strtoupper('\\1')", '/(^|_|-)+(.)/e' => "strtoupper('\\2')"));
+ return sfToolkit::camelize($text);
}

lib/vendor/symfony/lib/plugins/sfPropelPlugin/lib/form/sfFormFilterPropel.class.php

@@ -263,6 +263,6 @@ abstract class sfFormFilterPropel extends sfFormFilter
protected function camelize($text)
{
- return sfToolkit::pregtr($text, array('#/(.?)#e' => "'::'.strtoupper('\\1')", '/(^|_|-)+(.)/e' => "strtoupper('\\2')"));
+ return sfToolkit::camelize($text);
}

lib/vendor/symfony/lib/util/sfInflector.class.php

@@ -28,10 +28,7 @@ class sfInflector
public static function camelize($lower_case_and_underscored_word)
{
$tmp = $lower_case_and_underscored_word;
- $tmp = sfToolkit::pregtr($tmp, array('#/(.?)#e' => "'::'.strtoupper('\\1')",
- '/(^|_|-)+(.)/e' => "strtoupper('\\2')"));
-
- return $tmp;
+ return sfToolkit::camelize($tmp);
}

lib/vendor/symfony/lib/util/sfToolkit.class.php

@@ -608,4 +608,18 @@ class sfToolkit

return set_include_path(join(PATH_SEPARATOR, $paths));
}
+
+ public static function camelize($text)
+ {
+ if (preg_match('#/(.?)#', $text, $matches)) {
+ $text = str_replace($matches[0], '::'.strtoupper($matches[1]), $text);
+ }
+ if (preg_match('/(^|_|-)+(.)/', $text, $matches)) {
+ $text = preg_replace_callback('/(^|_|-)+(.)/',
+   function ($m){
+     return strtoupper($m[2]);
+   }, $text);
+ }
+ return $text;
+ }
}

コサイン類似度を求める このエントリーをはてなブックマークに追加

25 8月

この記事は、前のブログから加筆修正して転載しています。

研究でコサイン類似度を求めなくてはならなくなりました。
コサイン類似度ってなんだ??どうやるんだ??まったく検討つかない!というレベルから、計算式はわかった!とりあえず値を出す関数まで作ろう!というレベルに達したのでメモしておきます。
あんまりコサイン類似度自体の本質はわかってないかもしれませんが、遅延評価勉強法というかんじです。

コサイン類似度とは

2つのデータが似ているかどうかを、文字列が似てるのを調べる分野では距離などで換算します。
ちょっとよくわからないかもしれませんが、ぴいことぴいたろう君の類似度は、なんらかの測定器を使うと60mくらいの距離です。ぴいこと弟の類似度は、その測定器では30mくらいの距離でした。弟とぴいこは近いので、ぴいたろう君より似ています。

みたいなかんじ。

コサイン類似度ではベクトルというものを使います。ベクトルってなんだ!!わけわかんねーこと言うな!!!と思っていましたが、先輩や同期の面々から教わって、なんとなくわかってきました。。。

2つのベクトルの類似度を測るには

ここに、2つのベクトルがあります。
ベクトルっていうとわかりづらいです。「配列」にします。
配列m1、m2には図のように、Apple Banana Orangeの項目が入っています。
これからやりたいのは、m1とm2がどれくらい似ているか(似ている要素を持っているか)です。

計算式を考えないで見てみると、m1とm2にはどちらもAppleが入っているので、それなりに似てそうです。

m1とm2にある要素を展開します。2つの配列には3種類の項目がありました。

各配列にある要素には1のフラグを立てて、ない要素には0を立てます。すると、m1はAppleとBanana、m2はAppleとOrangeにフラグが立ちます。

計算式は上記のような、分数の計算になります。

分子は二つの配列のANDを取ったときの1の個数です。今回でいうとm1とm2どちらにもAppleがあるので、ANDで1になる項目が1つです。

分母はm1の1の個数(AppleとBanana分の2)のルートかける、m2の個数(AppleとOrange分の2)です。

そうすると、1/(ルート2*ルート2) = 0.5となります。

どうなると似るのか

1に近づくと似ています。1だと全く同じ要素を持つものです。0だと全然違う要素のものです。このしきい値はそのシステムによって違うようですが、0.5〜0.7以上あればだいたい似てると思います。たぶん。

function cosSim($w1 = null, $w2 = null){
  $w = array_values(array_unique(array_merge($w1, $w2)));
  for($i=0; $i $m1[$i] = false;
    $m2[$i] = false;
  }

  //$wが$m1にあるか調べる
  foreach($w1 as $wi){
    $key = array_search($wi, $w);
    if($key !== FALSE)
      $m1[$key] = true;
  }

  //$wが$m2にあるか調べる
  foreach($w2 as $wi){
    $key = array_search($wi, $w);
    if($key !== FALSE)
      $m2[$key] = true;
  }

  //Cos類似度用計算
  //分子
  $and = 0;
  for($i=0; $i if($m1[$i] && $m2[$i]){
    $and++;
  }

  //分母
  $m1and = 0;
  foreach($m1 as $m){
    if($m)
      $m1and++;
  }
  $m2and = 0;
  foreach($m2 as $m){
    if($m)
      $m2and++;
  }

  $m1and = sqrt($m1and);
  $m2and = sqrt($m2and);

  if($and == 0 || $m1and == 0 || $m2and == 0){
    return 0;
  } else {
    return $and/($m1and * $m2and);
  }
}

$m1 = array('Apple', 'Banana'); //文章Aのベクトル
$m2 = array('Apple', 'Orange'); //文章Bのベクトル
echo cosSim($m1, $m2); //0.5

symfony1.4のアレコレをCakePHP2でいうと このエントリーをはてなブックマークに追加

25 12月

1月からのプロジェクトに参画するにあたり、CakePHPを勉強中。

でも、普段はsymfonyの1.4しか使っていないので、symfonyでいうあれってCakeでなんて書くんだ…?というのがものすごくストレス。地味に削られてゆくよ…

  • URLを作成する
    • [sf] url_for(‘CONTROLLER/ACTION’);
    • [cake] $this->Html->url(array(‘controller’ => CONTROLLER, ‘action’ => ACTION));
  • Flashメッセージの読み取り
    • [sf] $sf_user->getFlash()
    • [cake] $this->Session->flash()
  • ページネーションの有無
    • [sf] $sfPager->haveToPaginate()
    • [cake] なし(自分でPaginatorHelperを継承して実装するっぽい)

随時追加