Author: Matthieu Bilbille (@mbilbille)
Exemple #1
0
 public function testConvertKatakanaToHiraganaWhenMixCharacters()
 {
     $result = Helper::convertKatakanaToHiragana($this->mixCharacters);
     $this->assertEquals('今日、Joo「じょお」は学校にいます。', $result);
 }
Exemple #2
0
 /**
  * Converts a year in Japanese format into Western format.
  *
  * @param $year : kanji or hiragana era name followed by digits, or era name in romaji, space and digit. I.e. : 明治33, めいじ33, Meiji 33
  * @return string|array : The year(s) in Western format.
  * @throws Exception
  */
 public static function toWesternYear($year)
 {
     if (Analyzer::hasKanji($year)) {
         $key = 'kanji';
         $eraName = Helper::extractKanji($year);
         $eraName = $eraName[0];
         $eraValue = (int) Helper::subString($year, Analyzer::length($eraName), Analyzer::length($year));
     } elseif (Analyzer::hasHiragana($year)) {
         $key = 'kana';
         $eraName = Helper::extractHiragana($year);
         $eraName = $eraName[0];
         $eraValue = (int) Helper::subString($year, Analyzer::length($eraName), Analyzer::length($year));
     } else {
         $key = 'romaji';
         $year = strtolower($year);
         $parts = explode(' ', $year);
         $eraName = $parts[0];
         $eraValue = (int) $parts[1];
     }
     if (empty($eraName) || empty($eraValue)) {
         throw new Exception('Invalid year ' . $year);
     }
     $max = count(self::$mapEras);
     $westernYears = array();
     for ($i = 0; $i < $max; $i++) {
         $era = self::$mapEras[$i];
         $overflown = false;
         if (strtolower($era[$key]) == $eraName) {
             $eraStart = $era['year'];
             $westernYear = $eraStart + $eraValue - 1;
             if ($i < $max - 1) {
                 $nextEra = self::$mapEras[$i + 1];
                 $nextEraYear = $nextEra['year'];
                 if ($westernYear > $nextEraYear) {
                     $overflown = true;
                 }
             }
             $westernYears[] = array('value' => $westernYear, 'overflown' => $overflown);
         }
     }
     $results = array();
     foreach ($westernYears as $westernYear) {
         if (!$westernYear['overflown']) {
             $results[] = $westernYear['value'];
         }
     }
     if (empty($results)) {
         throw new Exception('Year ' . $year . ' is invalid');
     } elseif (count($results) == 1) {
         return $results[0];
     } else {
         return $results;
     }
 }
 public function segment($input)
 {
     $results = array();
     $segments = array('B3', 'B2', 'B1');
     $types = array('O', 'O', 'O');
     $parts = Helper::split($input);
     for ($i = 0; $i < count($parts); ++$i) {
         $segments[] = $parts[$i];
         $types[] = $this->getType($parts[$i]);
     }
     $segments[] = 'E1';
     $segments[] = 'E2';
     $segments[] = 'E3';
     $types[] = 'O';
     $types[] = 'O';
     $types[] = 'O';
     $word = $segments[3];
     $p1 = 'U';
     $p2 = 'U';
     $p3 = 'U';
     for ($i = 4; $i < count($segments) - 3; ++$i) {
         $score = $this->BIAS;
         $w1 = $segments[$i - 3];
         $w2 = $segments[$i - 2];
         $w3 = $segments[$i - 1];
         $w4 = $segments[$i];
         $w5 = $segments[$i + 1];
         $w6 = $segments[$i + 2];
         $c1 = $types[$i - 3];
         $c2 = $types[$i - 2];
         $c3 = $types[$i - 1];
         $c4 = $types[$i];
         $c5 = $types[$i + 1];
         $c6 = $types[$i + 2];
         $score += $this->getScore($this->UP1, $p1);
         $score += $this->getScore($this->UP2, $p2);
         $score += $this->getScore($this->UP3, $p3);
         $score += $this->getScore($this->BP1, $p1 . $p2);
         $score += $this->getScore($this->BP2, $p2 . $p3);
         $score += $this->getScore($this->UW1, $w1);
         $score += $this->getScore($this->UW2, $w2);
         $score += $this->getScore($this->UW3, $w3);
         $score += $this->getScore($this->UW4, $w4);
         $score += $this->getScore($this->UW5, $w5);
         $score += $this->getScore($this->UW6, $w6);
         $score += $this->getScore($this->BW1, $w2 . $w3);
         $score += $this->getScore($this->BW2, $w3 . $w4);
         $score += $this->getScore($this->BW3, $w4 . $w5);
         $score += $this->getScore($this->TW1, $w1 . $w2 . $w3);
         $score += $this->getScore($this->TW2, $w2 . $w3 . $w4);
         $score += $this->getScore($this->TW3, $w3 . $w4 . $w5);
         $score += $this->getScore($this->TW4, $w4 . $w5 . $w6);
         $score += $this->getScore($this->UC1, $c1);
         $score += $this->getScore($this->UC2, $c2);
         $score += $this->getScore($this->UC3, $c3);
         $score += $this->getScore($this->UC4, $c4);
         $score += $this->getScore($this->UC5, $c5);
         $score += $this->getScore($this->UC6, $c6);
         $score += $this->getScore($this->BC1, $c2 . $c3);
         $score += $this->getScore($this->BC2, $c3 . $c4);
         $score += $this->getScore($this->BC3, $c4 . $c5);
         $score += $this->getScore($this->TC1, $c1 . $c2 . $c3);
         $score += $this->getScore($this->TC2, $c2 . $c3 . $c4);
         $score += $this->getScore($this->TC3, $c3 . $c4 . $c5);
         $score += $this->getScore($this->TC4, $c4 . $c5 . $c6);
         $score += $this->getScore($this->UQ1, $p1 . $c1);
         $score += $this->getScore($this->UQ2, $p2 . $c2);
         $score += $this->getScore($this->UQ1, $p3 . $c3);
         $score += $this->getScore($this->BQ1, $p2 . $c2 . $c3);
         $score += $this->getScore($this->BQ2, $p2 . $c3 . $c4);
         $score += $this->getScore($this->BQ3, $p3 . $c2 . $c3);
         $score += $this->getScore($this->BQ4, $p3 . $c3 . $c4);
         $score += $this->getScore($this->TQ1, $p2 . $c1 . $c2 . $c3);
         $score += $this->getScore($this->TQ2, $p2 . $c2 . $c3 . $c4);
         $score += $this->getScore($this->TQ3, $p3 . $c1 . $c2 . $c3);
         $score += $this->getScore($this->TQ4, $p3 . $c2 . $c3 . $c4);
         $p = 'O';
         if ($score > 0) {
             $results[] = $word;
             $word = '';
             $p = 'B';
         }
         $p1 = $p2;
         $p2 = $p3;
         $p3 = $p;
         $word .= $segments[$i];
     }
     $results[] = $word;
     return $results;
 }
Exemple #4
0
 /**
  * Inflects radical for the given verb to the given form
  *
  * @param array $verb
  * @param $form
  * @return array
  */
 public static function getRadicals(array $verb, $form)
 {
     $kanji = $verb['kanji'];
     $kana = $verb['kana'];
     $type = $verb['type'];
     if ($type == 'k') {
         switch ($form) {
             case self::NON_PAST_NEGATIVE:
             case self::PAST_NEGATIVE:
             case self::PASSIVE:
             case self::PASSIVE_SUSPENSIVE:
             case self::IMPERATIVE_POLITE_NEGATIVE:
             case self::IMPERATIVE_HARD:
             case self::FACTITIVE:
             case self::FACTITIVE_SHORTENED:
             case self::POTENTIAL_NEUTRAL:
             case self::POTENTIAL_POLITE:
             case self::VOLITIONAL_FAMILIAR:
             case self::NOT_LOOK_LIKE_POLITE:
             case self::NOT_LOOK_LIKE_NEUTRAL:
                 $kanaRadical = 'こ';
                 break;
             default:
                 $kanaRadical = 'き';
         }
     } elseif ($type == 's-i') {
         $kanaRadical = '';
     } else {
         $kanaRadical = Helper::subString($kana, 0, Analyzer::length($kana) - 1);
     }
     if (!empty($kanji)) {
         $kanjiRadical = Helper::subString($kanji, 0, Analyzer::length($kanji) - 1);
     } else {
         $kanjiRadical = null;
     }
     return array('kanji' => $kanjiRadical, 'kana' => $kanaRadical);
 }
Exemple #5
0
 /**
  * Hack to call Helper::convertHiraganaToKatakana() within the
  * transliteration workflow.
  *
  * @param string $str String to be converted.
  *
  * @return string Converted string.
  *
  * @see JpnForPhp\Helper\Helper::convertHiraganaToKatakana()
  */
 protected function convertHiraganaToKatakana($str)
 {
     return Helper::convertHiraganaToKatakana($str);
 }