タマネギ、またはオニオンではない?

オニオン(警告:多くの記事はNSFWです)は風刺的なニュース組織です。伝統的なニュースメディアをパロディー化します。 2014年、TheOnionはBuzzFeedのような「クリックベイト」サイトをパロディー化する風刺ニュースウェブサイトである ClickHole (警告:NSFWも頻繁に)を立ち上げました。 ポーの法則のおかげで、人々がオニオンやクリックホールの記事の見出しを読んで、知らないうちに真実であると信じることはかなり一般的です。彼らは風刺を意図していること。逆は、ばかげた響きの本物のニュース記事でも起こります。人々は、そうでないときは風刺だと思うことがよくあります。

この混乱は、当然のことながらゲームに役立ちます。ニュースの見出しを考えると、風刺ではありません。この課題は、プログラムでまさにそれを行うことです。

ニュースの見出し(印刷可能なASCII文字とスペースのみで構成される文字列)が与えられた場合、1を出力します。見出しは風刺、そうでない場合は0です。スコアは、正しい出力の数を見出しの総数で割ったものになります。

通常どおり、標準の抜け穴(特にテストケースの最適化)は許可されていません。これを強制するために、200個の非表示のテストケースのセット(The Onionから100個、Not The Onionから100個)でプログラムを実行します。ソリューションが有効であるためには、公開テストケースのスコアよりも20パーセントポイント以下低いスコアである必要があります。

テストケース

この課題のテストケースを考え出すには、 The Onion subreddit (ClickHoleなどのThe Onionとその子サイトの記事が掲載されている)から25の見出しを選び、

Not The Onion subreddit (風刺のように聞こえる実際のニュース記事が投稿されています)。見出しに加えた唯一の変更は、「派手な」引用符を通常のASCII引用符に置き換え、大文字の使用を標準化することでした。それ以外はすべて、元の記事の見出しから変更されていません。各見出しは独自の行にあります。

オニオンの見出し

Trump Warns Removing Confederate Statues Could Be Slippery Slope To Eliminating Racism Entirely "No Way To Prevent This," Says Only Nation Where This Regularly Happens My Doctor Told Me I Should Vaccinate My Children, But Then Someone Much Louder Than My Doctor Told Me I Shouldn"t Man At Park Who Set Up Table Full Of Water Cups Has No Idea How Passing Marathon Runners Got Impression They Can Take Them This Child Would Have Turned 6 Today If His Mother Hadn"t Given Birth To Him In October Incredible Realism: The Campaign In The Next "Call Of Duty" Will Begin At Your Avatar"s High School Cafeteria When He"s Being Tricked Into Joining The Military By A Recruiter "Sometimes Things Have To Get Worse Before They Get Better," Says Man Who Accidentally Turned Shower Knob Wrong Way Report: Uttering Phrase "Easy Does It" Prevents 78% Of Drywall Damage While Moving Furniture Barbara Bush Passes Away Surrounded By Loved Ones, Jeb Family Has Way Too Many Daughters For Them Not To Have Been Trying For Son News: Privacy Win! Facebook Is Adding A "Protect My Data" Button That Does Nothing But Feels Good To Press Dalai Lama Announces Next Life To Be His Last Before Retirement Researchers Find Decline In Facebook Use Could Be Directly Linked To Desire To Be Happy, Fully Functioning Person Manager Of Combination Taco Bell/KFC Secretly Considers It Mostly A Taco Bell Trump: "It"s My Honor To Deliver The First-Ever State Of The Union" Daring To Dream: Jeff Bezos Is Standing Outside A Guitar Center Gazing Longingly At A $200 Billion Guitar Area Dad Looking To Get Average Phone Call With Adult Son Down To 47.5 Seconds Experts Warn Beef Could Act As Gateway Meat To Human Flesh Jeff Bezos Named Amazon Employee Of The Month Dad Suggests Arriving At Airport 14 Hours Early Report: Only 3% Of Conversations Actually Need To Happen Delta Pilot Refuses To Land Until Gun Control Legislation Passed Family Wishes Dad Could Find Healthier Way To Express Emotions Than Bursting Into Full-Blown Musical Number New Honda Commercial Openly Says Your Kids Will Die In A Car Crash If You Buy A Different Brand Teacher Frustrated No One In Beginner Yoga Class Can Focus Chakras Into Energy Blast 

オニオンの見出しではありません

Man Rescued From Taliban Didn"t Believe Donald Trump Was President Nat Geo Hires Jeff Goldblum To Walk Around, Being Professionally Fascinated By Things Mike Pence Once Ratted Out His Fraternity Brothers For Having A Keg Reddit CEO Tells User, "We Are Not The Thought Police," Then Suspends That User Trump Dedicates Golf Trophy To Hurricane Victims Uber"s Search For A Female CEO Has Been Narrowed Down To 3 Men ICE Director: ICE Can"t Be Compared To Nazis Since We"re Just Following Orders Passenger Turned Away From Two Flights After Wearing 10 Layers Of Clothing To Avoid Luggage Fee Somali Militant Group Al-Shabaab Announces Ban On Single-Use Plastic Bags UPS Loses Family"s $846k Inheritance, Offers To Refund $32 Shipping Fee Teen Suspended From High School After Her Anti-Bullying Video Hurts Principal"s Feelings Alabama Lawmaker: We Shouldn"t Arm Teachers Because Most Are Women Cat Named After Notorious B.I.G. Shot Multiple Times - And Survives EPA Head Says He Needs To Fly First Class Because People Are Mean To Him In Coach Apology After Japanese Train Departs 20 Seconds Early Justin Bieber Banned From China In Order To "Purify" Nation Alcohol Level In Air At Fraternity Party Registers On Breathalyzer NPR Tweets The Declaration Of Independence, And People Freak Out About A "Revolution" Man Who Mowed Lawn With Tornado Behind Him Says He "Was Keeping An Eye On It." After Eating Chipotle For 500 Days, An Ohio Man Says He"s Ready For Something New "El Chapo" Promises Not To Kill Any Jurors From Upcoming Federal Trial After 4th DWI, Man Argues Legal Limit Discriminates Against Alcoholics Palestinian Judge Bans Divorce During Ramadan Because "People Make Hasty Decisions When They"re Hungry" Argentinian Officers Fired After Claiming Mice Ate Half A Ton Of Missing Marijuana "Nobody Kill Anybody": Murder-Free Weekend Urged In Baltimore 

コメント

  • Your score will be the number of correct outputs divided by the total number of headlinesバイトカウントはタイブレーカーですか?
  • I ‘混乱しています。どのような種類のソリューションを期待していますか?すべてのソリューションは、テストケースに合わせて”最適化する必要があります”やや、英語を理解でき、ユーモアのセンスがあるAIを書くバー。たとえば、Arnauld ‘のソリューションは/ly\b/これは25オニオのためにのみ機能しますあなたが選んだ見出しにはたまたま副詞がたくさんありますが、私が知っている限りでは、別のテストバッテリーで簡単につまずくことができます。そして、誰が’彼の係数が彼のスコアを最適化するために選ばれなかったと言うのですか?’ (なぜ’それらを最適化しないのですか?)
  • このテストバッテリーは少し珍しいようです。 ‘は、写真で犬を検出できる分類子を要求するようなものですが、陽性のテストケースを犬の写真として、陰性のテストケースを 25枚のオブジェクトの写真’誓うのは犬ですが、いや、彼らは犬であることがわかります’ t! (#11あなたの心を吹き飛ばします!)”それは十分に難しい問題を難しくします。
  • 挑戦は難しいだけでなく、’は、(私にとって)’の違いも自明ではありません。 ‘解決できない場合、もちろん私のプログラムは’解決できません(つまり、解決できないことを私に納得させます’ div id = “b4594fe07e”> テストケースのハードコード)
  • brain.jsとを使用して人工ニューラルネットワークのトレーニングに+36時間を費やしました。 LSTM、この号のサンプルと提供されたリンクからの各タイプの他の100のサンプルがありますが、結果は’新しいタイトルでは十分ではありませんでした’トレーニングセットには存在しません。 ‘完了:P

回答

JavaScript( ES7)、39/50(78%)

非表示のテストケースで63.5%(127/200)

タイトルの長さ、スペースの数、および-lyサフィックスの使用。

 isOnion = str => str.length ** 0.25 + str.split(" ").length ** 1.25 * 2 + str.split(/ly\b/).length ** 1.75 * 7 > 76  

オンラインでお試しください。

コメント

  • これは、非常にシンプルであるため、とてつもなく効果的です。
  • このソリューションのスコアは63.5%でした。隠されたテストケースなので、それは有効です。
  • サンドボックスの最初で可能だったほど単純ではありませんが(100%、標準化される前の大文字の違いを利用)、これは本当に簡単です。
  • @Mego好奇心から、この NSFWバージョンは隠されたテストケースのスコアを改善しますか? 🙂
  • @Arnauldそのバージョンで66%

回答

Python 3 84%

非表示のテストケースではテストされていません。

これは、さまざまな見出しでトレーニングされたKeras LSTMRNNを使用します。それを実行するには、次のKerasと、GitHubで利用できるようにしたモデルが必要です:リポジトリリンク。モデルと単語/ベクトルのマッピングは.pklにあります。最新の

依存関係は次のとおりです。

import numpy as np from pickle import load from keras.preprocessing import sequence, text from keras.models import Sequential from keras.layers import Dense, Embedding, SpatialDropout1D, LSTM, Dropout from keras.regularizers import l2 import re 

設定は次のとおりです。

max_headline_length = 70 word_count = 20740 

モデルは次のとおりです:

model = Sequential() model.add(Embedding(word_count, 32, input_length=max_headline_length)) model.add(SpatialDropout1D(0.4)) model.add(LSTM(64, kernel_regularizer=l2(0.005), dropout=0.3, recurrent_dropout=0.3)) model.add(Dropout(0.5)) model.add(Dense(32, kernel_regularizer=l2(0.005))) model.add(Dropout(0.5)) model.add(Dense(2, kernel_regularizer=l2(0.001), activation="softmax")) 

モデルと単語の埋め込みをロードします:

model.load_weights("model.h5") word_to_index = load(open("words.pkl", "rb")) 

文字列が「NotTheOnion」または「TheOnion」からのものかどうかをテストするコード「私は」文字列をそれぞれの単語の埋め込みに変換するクイックヘルパー関数を作成しました:

def get_words(string): words = [] for word in re.finditer("[a-z]+|[\"".;/!?]", string.lower()): words.append(word.group(0)) return words def words_to_indexes(words): return [word_to_index.get(word, 0) for word in words] def format_input(word_indexes): return sequence.pad_sequences([word_indexes], maxlen=max_headline_length)[0] def get_type(string): words = words_to_indexes(get_words(string)) result = model.predict(np.array([format_input(words)]))[0] if result[0] > result[1]: site = "NotTheOnion" else: site = "TheOnion" return site 

説明

このコードは単語を「ベクトル」として表現することにより、単語間の関係を分析するモデル。単語の埋め込みについて詳しくは、こちらをご覧ください。

これは見出しでトレーニングされていますが、テストケースは除外されています

このプロセスは、かなりの処理を経て自動化されます。最終的に処理された単語リストを.pklとして配布しましたが、単語の埋め込みで発生するのは、最初に文を分析して単語を分離することです。

次のステップは、特定の単語の相違点と類似点を理解できるようにすることです。たとえば、kingqueendukeduchess。これらの埋め込みは、実際の単語間ではなく、ファイル。マシンが理解できない単語は、特別な単語<UNK>にマップされます。これにより、そこに単語があることは理解できますが、意味が正確にはわからないことがわかります。

単語を理解できるようになったので、単語のシーケンス(見出し)を分析できるようにする必要があります。これが「LSTM」の機能であり、LTSMは「RNN」セルの一種です。グラデーション効果の消失を回避します。より簡単に言えば、一連の単語を取り込んで、それらの間の関係を見つけることができます。

これで、最後のレイヤーはDenseになります。これは基本的に、出力が[probability_is_not_onion, probability_is_onion]のような配列のようなものであることを意味します。どちらが大きいかを見つけることで、特定の見出しに対して最も信頼できる結果を選択できます。

回答

Python 3 + Keras、41/50 = 82%

非表示のテストケースで83%(166/200)

import json import keras import numpy import re from keras import backend as K STRIP_PUNCTUATION = re.compile(r"[^a-z0-9 ]+") class AttentionWeightedAverage(keras.engine.Layer): def __init__(self, return_attention=False, **kwargs): self.init = keras.initializers.get("uniform") self.supports_masking = True self.return_attention = return_attention super(AttentionWeightedAverage, self).__init__(**kwargs) def build(self, input_shape): self.input_spec = [keras.engine.InputSpec(ndim=3)] assert len(input_shape) == 3 self.W = self.add_weight(shape=(input_shape[2], 1), name="{}_W".format(self.name), initializer=self.init) self.trainable_weights = [self.W] super(AttentionWeightedAverage, self).build(input_shape) def call(self, x, mask=None): logits = K.dot(x, self.W) x_shape = K.shape(x) logits = K.reshape(logits, (x_shape[0], x_shape[1])) ai = K.exp(logits - K.max(logits, axis=-1, keepdims=True)) if mask is not None: mask = K.cast(mask, K.floatx()) ai = ai * mask att_weights = ai / (K.sum(ai, axis=1, keepdims=True) + K.epsilon()) weighted_input = x * K.expand_dims(att_weights) result = K.sum(weighted_input, axis=1) if self.return_attention: return [result, att_weights] return result def get_output_shape_for(self, input_shape): return self.compute_output_shape(input_shape) def compute_output_shape(self, input_shape): output_len = input_shape[2] if self.return_attention: return [(input_shape[0], output_len), (input_shape[0], input_shape[1])] return (input_shape[0], output_len) def compute_mask(self, input, input_mask=None): if isinstance(input_mask, list): return [None] * len(input_mask) else: return None if __name__ == "__main__": model = keras.models.load_model("combined.h5", custom_objects={"AttentionWeightedAverage": AttentionWeightedAverage}) with open("vocabulary.json", "r") as fh: vocab = json.load(fh) while True: try: headline = input() except EOFError: break tokens = STRIP_PUNCTUATION.sub("", headline.lower()).split() inp = numpy.zeros((1, 45)) for i, token in enumerate(tokens): try: inp[0,i] = vocab[token] except KeyError: inp[0,i] = 1 print(model.predict(inp)[0][0] > 0.3) 

combined.h5vocabulary.jsonは、ここ(非常に大きい)

ここ。

事前にトレーニングされた感情分析モデルDeepMojiに接続された完全に接続された分類器。これは、スタックされた双方向LSTMと注意メカニズムで構成されます。 DeepMojiレイヤーをフリーズし、最後のsoftmaxレイヤーを取り出し、完全に接続されたレイヤーだけをトレーニングしてから、DeepMojiレイヤーをフリーズ解除して、微調整のために一緒にトレーニングしました。注意メカニズムは https://github.com/bfelbo/DeepMoji/blob/master/deepmoji/attlayer.py から取得されます(すべてのコードを依存関係として使用する必要はありませんでした) 1つのクラスの場合、特にPython 2であり、モジュールとして使用するのは扱いにくいため…)

これは、Megoのテストセットでは驚くほどパフォーマンスが低く、私自身のより大きな検証セットではパフォーマンスが低下します。 > 90%を取得します。したがって、これはまだ完了していません。

コメント

  • 正しく実行したと仮定すると、非表示のテストケースで83%

回答

JavaScript( Node.js )、98%(49/50)

非表示のテストケースで96%(192/200)

 const words = require("./words"); const bags = require("./bags"); let W = s => s.replace(/[^A-Za-z0-9 ]/g, "").toLowerCase().split(" ").filter(w => w.length > 3); let M = b => { for (let i = 0; i < bags.length; i++) { let f = true; for (let j = 0; j < bags[i].length; j++) if (!b.includes(bags[i][j])) { f = false; break; } if (f) return true; } return false; }; let O = s => { let b = []; W(s).forEach(w => { let p = words.indexOf(w); if (p >= 0) b.push(p); }); return (b.length > 0 && M(b)); };  

これには、ここまたは” TiO 。次のリンクからダウンロードして、words.jsonとの名前。JSファイルと同じフォルダにあります。テストケースと結果/パーセント印刷を含むJSファイルへのリンクもあります。非表示のテストケースは、onions変数とnonOnions変数に配置できます。

3つのファイルすべてを同じディレクトリに保存した後、。

O関数は、タマネギでiv idの場合、trueを返します。 = “cac5915602”>

そうでない場合。入力文字列がタマネギであるかどうかを検出するために(順序なしで)ワードバッグの大きなリストを使用します。一種のハードコードされていますが、さまざまなランダムテストで非常にうまく機能します

コメント

  • このソリューションは、非表示のテストケースで96%を取得します

回答

Arnauldのソリューションの処理

JavaScript(ES6)、41/50

非表示で64%(128/200)テストケース

str.includes("Dad") || str.length ** .25 + str.split(" ").length ** 1.25 * 2 + str.split(/ly\b/).length ** 1.75 * 7 > 76 

JavaScript(ES6)、42/50

非表示のテストケースで62.5%(125/200)(無効)

isOnion = str => str.includes("Dad") || str.length ** .25 + str.split(" ").length ** 1.25 * 2 + str.split(" ").filter(w => w.length > 3 && w.split(/ly/).length > 1).length * 23.54 + /\d/.test(str) * 8 > 76 

長さ+単語数+ “ly 「コンセプトはかなりうまく機能しています。タイトルの3人目の人物の「お父さん」という単語をチェックすることで、さらにいくつかのポイントを絞り出すことができました(実際の記事では、タイトルの3人目の人のお父さんについて話しますか?)。 「ly」はヒューリスティックを検索し、タイトルに数字が含まれているかどうかを確認します(これは、テスト以外の一般的なケースでは有効性が低い可能性があるため、両方のソリューションを残しました)

コメント

  • お父さんの部分について’わかりません…テストケースを最適化するのと少し似ているようです…
  • はい、お父さんに言及しているNot theOnionの記事をたくさん見つけることができます
  • ヒューリスティックの一部としてそれを行うためのおそらくより良い方法があります’難しいだけではありません” win “お父さんが含まれている場合でも、テストデータベースの外でも、特定の”お父さん”はオニオンでより一般的です
  • 最初のソリューションは非表示のテストケースで64%を獲得したため、有効です。 2番目のソリューションは非表示のテストケースで62.5%を獲得したため、有効ではありません。
  • @Megoなんと近いマージン…

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です