2016-07-03 10 views
1

アルゴリズムと呼ぶことができるかどうかはわかりませんが、私はそれが近いと思います。 は私がタイトルに特定の単語を持っていますAPI、例えばからデータを引っ張っされます 特定のテキストの存在に基づいてメソッドをトリガするRubyのアルゴリズム

  • グレートソフトウェアトレントダウンロードたったの$ 10のための

    1. グレートソフトウェア2.0今すぐダウンロード
    2. 購入グレートソフトウェア

    ダウンロード、購入などの特定の単語の存在に基づいてさまざまなことを行いたいと思います。たとえば、「購入」という単語がある場合は、購入とその金額を抽出します値はタイトルにあり、別のdivに表示されるので、t彼の場合は "10ドルで買う"や "10ドルで買う"などとなりますが、私はそうすることもできますが、他にもそうしたいと思っています。だから、私が考えているのは、sendメソッドを使うことです。例:

    def buy(string) 
        'Buy for just' + string.scan(/\$\d+/).first 
    end 
    
    def whichkeyword(title) 
        send (title.scan(/(download|buy)/i)[0][0]).downcase.to_sym, title 
    end 
    
    whichkeyword('Buy this software for $10 now') 
    

    これを行うには良い方法がありますか?それともこれはこれを行う良い方法ですか?任意の助けを歓迎するでしょう

  • +0

    私はあなたがすでに適切な解決策を見つけ出したと思います。 –

    +0

    私はこれが難しいと答えました。特にあなたのソリューションについて改善したいことがありますか?おそらく、最初にこのコードを書く意欲の周りの詳細を提供することを検討してください。現在、正規表現メソッドの実装が少し違っているような曖昧に似た答えのスタック全体を取得しようとしています。メタプログラミングに関するいくつかのオプションを投げてください。私はここに価値を加える余地がないと思います。 – Stewart

    +0

    @Stewart実際に私はプロではないので、これが適切なルビーの方法であるかどうかを知りたいと思っていました。私が尋ねたかったのは、if/elseを使わずに、同様の問題をどうやって解決するかです。 –

    答えて

    2

    についてまず、そうでない場合はpublic_sendを使用し、sendを使用しています。

    この特定のケースでは、メタプログラミングは過剰です。あまりにも多くの冗長コードが必要です。さらに、コードを新しいアイテムに変更する必要があります。このハッシュは、どこかのコード、電子の外の場所であるかもしれない

    @hash = { 'buy' => { text: 'Buy for just %{placeholder}', re: /\$\d+/ } } 
    

    :私のようなハッシュを構築して行くだろう。 g。それはコードの近くにymlファイルに格納され、事前にロードされている可能性があります。そうすれば、コードを変更せずに動作を変更できる可能性があります。これは、たとえばgemで便利です。降伏

    def format string 
        key = string[/#{Regexp.union(@hash.keys).source}/i].downcase 
        puts @hash[key][:text] % { placeholder: string[@hash[key][:re]] } 
    end 
    

    宣言の方法に比べて多くの利点があります
    ▶ format("Buy this software for $10 now") 
    #⇒ Buy for just $10 
    

    、電子我々はハッシュがロード/規定されていたよう

    は、私はメソッドを呼び出します。 g。マッチにスペースが含まれている可能性があります。マッチャーなどを簡単に追加/削除できます。

    +0

    ありがとう、これはよりよく見え、簡単です。私はpublic_sendについて知らなかった。 –

    0

    私はこのソリューションは十分だと思います。
    奇妙に見えるのはscan(/(download|buy)/i)[0][0]です。

    私にとっては、Rubyで[]という構文を使用するのはあまり好きではありません。
    scanを使用していると思いますが、こちらは必要ありません。あなたはプライベートメソッドを呼び出すようにしている場合にのみ、と
    すべての 何

    def whichkeyword(title) 
        title =~ /(download|buy)/i 
        send $1.downcase.to_sym, title unless $1.nil? 
    end 
    

    UPDATE

    def whichkeyword(title) 
        action = title[/(download|buy)/i] 
        public_send action.downcase.to_sym, title if action 
    end 
    
    +0

    regexp paramを使って['String#[]'](http://ruby-doc.org/core-2.1.5/String.html#method-i-5B-5D)を発見してください: 'title [/(download |購入)/ i]#⇒[購入]を選択します。また、 'public_send'が適用可能なときは' send'を使わないでください。 – mudasobwa

    +0

    ありがとうございます。私は既存の 'public_send'について知らない。 – Aleksey

    +0

    私はpublic_sendも知らなかった。 @アレクシーおかげで、あなたのバージョンは間違いなくきれいに見えます。 –

    2

    まず、あなたのアルゴリズムは動作しますが、キーワードが適用されていない場合のようないくつかの問題があります。自然言語処理 - あなたはそれをはるかにダイナミックな、あなたがNLPを使用することができます行いたい場合は

    NLP

    私はあなたのための2つのソリューションを持っています。 NLPはあなたの文章の中の主要な言葉を見つけます。それからあなたはそれぞれの良い解決策を見つけることができます。
    そのための良い宝石は、で使用できるTreatです。データを処理した後、
    の動詞、さらにの同義語を検索して何をすべきかを知ることができます。

    sentence('Buy this software for $10 now').verbs # ['buy'] 
    

    シンプルなハッシュ
    このソリューションは、以下の動的ますが、はるかに簡単です。あなたがスキャンしたのと同じように、Constantを使用してキーワードとその出力を管理してください(私はlambdasでそれを行います)。ハッシュにデフォルトを追加することもできます

    KEYWORDS = Hash.new('Default Title').merge(
          buy: -> { }, 
          download: -> { } 
          ) 
    KEYWORDS[sentence[/(#{KEYWORDS.keys.join('|')})/i].downcase] 
    
    +2

    ルックアップのキーに 'to_sym'が必要です。単純な 'join '|''ではなく 'Regexp.union'を使うのが良いでしょう。 – mudasobwa

    +1

    もちろん、 'if'を1回だけ使用します。何もマッチしない場合は、デフォルトのテキストを返します。一致すれば、そのメソッドを呼び出します。自然言語処理は良いアイデアのように聞こえる。どれくらい重いですか?その基本的なアプリケーションは、私はローダの宝石を使用して構築し、可能な限りリーンとしてデータベースを維持することも目標の一つです。あなたが提供した解決策は、私の質問に書いたものよりも簡単だと思います。私はそれを試してみます。 –

    +0

    @mudasobwaあなたはto_symについて正しいですが、HashWithIndifferentAccessも使用できます。 'Regexp.union'については、大文字と小文字を区別する(/ reg/** i **)問題があると思います。 @ b-a NLPはあなたのデータベースを使用していません。別のものを開きます。単純な解決策が今あなたのために働くことができますが、プロジェクトを展開したいときはnlpを覚えておいてください。 –

    関連する問題