web-dev-qa-db-ja.com

単数形と複数形を切り替える機能?

文字列を指定すると、文字列が単数形/複数形に切り替わる関数を探しています。英語以外のヨーロッパ言語で動作するために必要です。

トリックを実行できる関数はありますか? (変換する文字列と言語を指定しますか?)

ありがとう

20
dynamic

このタイプの操作にはPHP)に組み込まれている関数はありません。ただし、目標を達成するために使用できるツールがいくつかあります。

複数形に関する情報を含む非公式のGoogle辞書APIがあります。 そのメソッドはここにあります についてもっと読むことができます。適切なアイテムを見つけるにはJSONオブジェクトを解析する必要があり、このメソッドは少し遅くなる傾向があります。

頭に浮かぶもう1つの方法は、aspellまたはその親戚の1つを使用することです。英語以外の言語の辞書がどれほど正確かはわかりませんが、aspellを使用して単語をさまざまな形式に拡張しました。

これが最も役立つ答えではないことはわかっていますが、検索するための一般的な方向性が得られることを願っています。

7
thetaiko

これが私の便利な機能です:

function plural( $amount, $singular = '', $plural = 's' ) {
    if ( $amount === 1 ) {
        return $singular;
    }
    return $plural;
}

デフォルトでは、文字列の後に「s」を追加するだけです。例えば:

echo $posts . ' post' . plural( $posts );

これにより、「0投稿」、「1投稿」、「2投稿」、「3投稿」などがエコーされます。ただし、次のこともできます。

echo $replies . ' repl' . plural( $replies, 'y', 'ies' );

「0件の返信」、「1件の返信」、「2件の返信」、「3件の返信」などをエコーし​​ます。

echo $replies . ' ' . plural( $replies, 'reply', 'replies' );

また、他のいくつかの言語でも機能します。たとえば、スペイン語では次のようにします。

echo $comentarios . ' comentario' . plural( $comentarios );

これは、「0コメンタリオ」、「1コメンタリオ」、「2コメンタリオ」、「3コメンタリオ」などをエコーし​​ます。または、「s」を追加する方法がない場合は、次のようにします。

echo $canciones . ' canci' . plural( $canciones, 'ón', 'ones' );

これは、「0カンシオン」、「1カンシオン」、「2カンシオン」、「3カンシオン」などをエコーし​​ます。

31
Sophivorus

これは簡単なことではありません。各言語には、複数形の名詞を形成するための独自の規則があります。英語では、「-x」、「-s」、「-z」、「-sh」、「-ch」で終わっていない限り、単語の末尾に「-s」を付ける傾向があります。 「-es」を追加した場合。しかし、「マウス」=>「マウス」、「羊」=>「羊」などがあります。

次に、最初に行うことは、使用する言語の単数名詞から複数形を形成するための規則を見つけることです。しかし、それがすべての解決策ではありません。もう1つの問題は、名詞の認識です。名詞が与えられ、それを単数形から複数形に変換する必要がある場合、それはそれほど難しいことではありませんが、フリーテキストが与えられ、単数形の名詞を見つけて複数形に変換する必要がある場合、それははるかに困難です。名詞のリストを取得できますが、もちろん一部の単語は名詞や動詞( "hunt"、 "fish"、 "break"など)である可能性があるため、テキストを解析して名詞を識別する必要があります。

それは大きな問題です。おそらくあなたが必要とすることをするAIシステムがそこにあるでしょう、しかし私はそれをすべてする無料のものがあるとは思いません。

8
Ben

英語のみのソリューション

これがPHPこれまで完璧に機能してきたクラスです: http://kuwamoto.org/2007/12/17/improved-pluralizing-in-php-actionscript -and-ror /

これは、サイトがなくなった場合の要点です: https://Gist.github.com/tbrianjones/ba0460cc1d55f357e00b

これは小さなクラスであり、他の言語に簡単かつ迅速に変換できます。

7
T. Brian Jones

これは、私が通常、それほど複雑でないシナリオで使用するクイック関数です。

public static function getPluralPrase($phrase,$value){
    $plural='';
    if($value>1){
        for($i=0;$i<strlen($phrase);$i++){
            if($i==strlen($phrase)-1){
                $plural.=($phrase[$i]=='y')? 'ies':(($phrase[$i]=='s'|| $phrase[$i]=='x' || $phrase[$i]=='z' || $phrase[$i]=='ch' || $phrase[$i]=='sh')? $phrase[$i].'es' :$phrase[$i].'s');
            }else{
                $plural.=$phrase[$i];
            }
        }
        return $plural;
    }
    return $phrase;
}

より複雑なソリューションの場合は、@ Tを使用できます。ブライアンジョーンズのソリューション

3
user28864

ジェームズ・コンスタンティーノの答えが好きです。シンプルで効率的で、あらゆる言語であらゆるケースをマスターすることができます。より多くのコードを書かなければなりませんが(つまり、Wordの一般的な部分の2倍)。

もちろん、TBrianJonesソリューションも気に入っていますが、英語でしか機能しません(そのままで、通常のヨーロッパ言語であるドイツ語、フランス語、スペイン語、イタリア語、ポルトガル語に簡単に拡張できます)。それをありがとう。使用される単語の頻度がわかっている場合は、行を再編成することで最適化できます。

また、フェリペの提案は良いです、そしてところで、plebiscited。

しかし、すべての解決策で、私がバグと見なすものを見つけました。各自が値1にのみ単数形を使用し、それ以外の場合は複数形を使用します。これは明らかに負の値では間違っていますが、少なくともフランス語では、厳密に2より低い値でも間違っています。

ジェームズのコードをベースとして最適化した私の提案は次のとおりです。

function singleOrPlural($amount, $singular, $plural) {
  return (abs($amount)>=2
    ? $amount.' '.$plural 
    : $amount.' '.$singular
  );
}

したがって、次のようなコード

echo "We bought ".singleOrPlural(1.5, "pound", "pounds")
    ." of apples and ".singleOrPlural(2, "pound", "pounds")." of bread.";

あげる

We bought 1.5 pound of apples and 2 pounds of bread.

どちらが正しい。

ゼロの値については、オブジェクトがないため、複数形の理由がわかりませんが、アングロサクソン人のネイティブが使用されている可能性があります。

HTH、M。

2
Madmarsu

私はこのようなもののためのかなり簡単な解決策を思いついた。ただし、これは、一般的なPHPおよびカスタムmySQLiクラスの事前知識に依存します。これは ここnum_rowsの使用法を説明しています)。

私の場合、データベースからいくつかのメモを取り出して「1メモ」と言ってから、1以降のすべての単語に「メモ」と「0メモ」と言う必要がありました。

データベースからプルしてカウントを行うには、次を使用する必要がありました:$total_notes = $database->num_rows("SELECT notes_id FROM $notes_db");

そして、値をエコーするコード...

<?php
 if($total_notes === 1){
 echo '<strong>1</strong> note.';
 }elseif($total_notes > 1){
 echo '<strong>'.$total_notes.'</strong> notes.';                                                                           
 }elseif($total_notes === 0){
 echo '<strong>0</strong> notes.';                                                                      
 }
?>
0
Robert Dewitt

多言語ソリューションがあります。

 function howmany($number,$singular,$plural) {
      if($number==1) return $number.' '.$singular;
      else return $number.' '.$plural;
 }

次のように関数を呼び出します。

echo howmany($variablenumber,upcase('kaibigan'),upcase('ng kaibigan'));

お役に立てれば!

0

次のことを試すことができます、

if ( !function_exists('pluralize') ) {
    function pluralize( $amount, $singular, $plural, $show=false ) {
        $OP = $show ? $amount.' ' : '';
        $OP .= ( $amount == 1 ) ? $singular : $plural;
        return $OP;
    }
}
0
Bengala