Sipuli vai ei sipuli?

Sipuli (varoitus: monet artikkelit ovat NSFW) on satiirinen uutisorganisaatio, joka parodioi perinteistä uutismediaa. Vuonna 2014 The Onion lanseerasi ClickHole (varoitus: usein myös NSFW), satiirisen uutissivuston, joka parodioi ”clickbait” -sivustoja, kuten BuzzFeed. Poen lain ansiosta on melko yleistä, että ihmiset lukevat The Onion- tai ClickHole-artikkelien otsikot ja uskovat niiden olevan totta, tietämättä että ne on tarkoitettu satiiriksi. Päinvastoin tapahtuu myös naurettavan kuulostavien todellisten uutisten kanssa – ihmiset ajattelevat usein olevansa satiiria, kun eivät ole.

Tämä sekaannus luonnollisesti soveltuu peliin – uutisotsikon perusteella yritä arvata, vai ei se ole satiiri. Tämän haasteen kohteena on täsmälleen saman tekeminen ohjelman kanssa.

Kun otetaan huomioon uutisotsikko (merkkijono, joka koostuu vain tulostettavista ASCII-merkeistä ja välilyönneistä), tulosta 1, jos otsikko on satiiri, tai 0, jos se ei ole. Pisteesi on oikeiden tulosten lukumäärä jaettuna otsikoiden kokonaismäärällä.

Kuten tavallista, tavalliset porsaanreiät (varsinkin optimointi testitapauksia varten ) eivät ole sallittuja. Tämän toteuttamiseksi aion suorittaa ohjelmat 200 piilotetussa testitapauksessa (100 The Onionilta, 100 Not The Onionilta). Ratkaisusi saa olla korkeintaan 20 prosenttiyksikköä pienempi kuin julkisissa testituloksissa saatu piste, jotta se olisi pätevä.

Testitapaukset

Kokeile testitapauksia tähän haasteeseen , Valitsin 25 otsikkoa sivulta The Onion subreddit (johon on kirjoitettu artikkeleita The Onion ja sen lapsisivustot, kuten ClickHole), ja 25 otsikkoa osoitteesta Not The Onion -subreddit (johon lähetetään todellisia satiirilta kuulostavia uutisartikkeleita). Ainoat muutokset, jotka tein otsikoihin, olivat ”hienojen” lainausten korvaaminen tavallisilla ASCII-lainauksilla ja isojen kirjainten standardointi – kaikki muu ei muutu alkuperäisen artikkelin otsikossa. Jokainen otsikko on omalla rivillään.

Sipulin otsikot

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 

Ei sipulin otsikot

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 

kommentit

  • Your score will be the number of correct outputs divided by the total number of headlines Onko tavumäärä solmittu?
  • I ’ ma vähän hämmentynyt. Minkä eräänlaisen ratkaisun odotat? Jokaisen ratkaisun täytyy ” optimoida testitapauksia varten ” jossain määrin, esto kirjoittaa tekoälyä, joka ymmärtää englantia ja jolla on huumorintaju. Esimerkiksi Arnauld ’ ratkaisu havaitsee /ly\b/ mikä toimii vain siksi, että 25 Onio n valitsemassasi otsikossa on satunnaisesti enemmän adverbeja, mutta kaiken tiedän, että voit helposti sietää sen toisella testiparistolla. Ja kuka ’ s sanoo, että hänen kertoimensa eivät ole ’ t valittu optimoimaan pisteitään? (Miksi hän ei optimoisi niitä?)
  • Tämä testiakku tuntuu hieman epätavalliselta. ’ haluaa pyytää luokitusta, joka tunnistaa koirat valokuvasta, mutta otat positiiviset testitapauksesi valokuvina koirista ja negatiiviset testitapauksesi Buzzfeed-artikkelista nimeltä ” 25 valokuvaa esineistä, jotka ’ ll vannot koiria, mutta ei, osoittautuu, että he ovat ’ t! (# 11 räjäyttää mieltäsi!) ” Se tekee tarpeeksi kovasta ongelmasta vaikeamman.
  • Haaste ei ole vain vaikea, mutta se ’ ei myöskään ole ilmeinen (minulle) mikä ’ on ero. Jos en voi ’ ratkaista sitä, tietysti ohjelmani ei voi ratkaista sitä (toisin sanoen vakuuttaa minua siitä, että se ei ole

. div id = ”b4594fe07e”> t -koodi testitapauksille)

  • Hyvin vietin +36 tuntia keinotekoisen hermoverkon kouluttamiseen käyttämällä brain.js ja LSTM, tämän numeron näytteillä ja 100 muulla näytteellä kutakin tyyppiä toimitetuista linkeistä, mutta tulos ei ollut tarpeeksi hyvä uusilla otsikoilla, jotka olivat ’ ei ole läsnä harjoittelusarjoissa. Olen ’ tehnyt: P
  • Vastaa

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

    63,5% (127/200) piilotetuissa testitapauksissa

    Yksinkertainen heuristinen otsikon pituuden, välilyöntien ja -ly -liitteen käyttö.

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

    Kokeile verkossa!

    Kommentit

    • Tämä on järjetöntä, kuinka yksinkertaista se on.
    • Tämä ratkaisu sai 63,5% piilotetut testitapaukset, joten se on kelvollinen.
    • Ei niin yksinkertaista kuin mahdollista hiekkalaatikon alussa (100%, hyödyntämällä isojen kirjainten erot ennen standardointia), mutta tämä on todella yksinkertaista.
    • @Mego parantaako

    NSFW -versio vain uteliaisuudesta piilotettujen testitapausten pistemäärää? 🙂

  • @Arnauld 66% tuon version kanssa
  • Vastaa

    Python 3, 84%

    Ei testattu piilotetuissa testitapauksissa.

    Tämä käyttää eri otsikoihin koulutettua Keras LSTM RNN -ohjelmaa. Sen suorittamiseen tarvitaan seuraavat Keras ja malli, jonka olen asettanut saataville GitHubissa: repolinkki . Tarvitset mallin .h5 ja sana- / vektorikartoitukset ovat .pkl. Uusimmat

    Riippuvuudet ovat:

    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 

    Asetukset ovat:

    max_headline_length = 70 word_count = 20740 

    Malli on:

    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")) 

    Lataa nyt malli ja sanojen upotukset:

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

    Ja koodi, jolla testataan, onko merkkijono peräisin NotTheOnionista tai TheOnionista ”Olen kirjoittanut pika-aputoiminnon, joka muuntaa merkkijonon vastaaviksi sanojen upotuksiksi:

    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 

    Selitys

    Tämä koodi suorittaa malli, joka analysoi sanojen välisiä suhteita edustamalla sanoja ”vektorina”. Voit oppia lisää sanojen upottamisesta täältä .

    Tämä on koulutettu otsikoihin, mutta testitapaukset eivät kuulu .

    Tämä prosessi automatisoidaan melkoisen käsittelyn jälkeen. Olen jakanut lopullisen käsitellyn sanaluettelon .pkl, mutta sanojen upottamisessa tapahtuu ensin analysoimme lause ja eristämme sanat.

    Kun nyt on sanat seuraava askel on ymmärtää eroja ja samankaltaisuuksia tiettyjen sanojen välillä, esim. king ja queen vs. duke ja duchess. Nämä upotukset eivät tapahdu varsinaisten sanojen välillä, vaan sanoja edustavien numeroiden välillä, mikä on tallennettu kansioon .pkl -tiedosto. Sanat, joita kone ei ymmärrä, yhdistetään erityiseen sanaan <UNK>, jonka avulla voimme ymmärtää, että siellä on sana, mutta että ei tiedetä tarkalleen mitä merkitys on. / p>

    Nyt kun sanat voidaan ymmärtää, sanasekvenssi (otsikko) on voitava analysoida. Tätä ”LSTM” tekee. LTSM on ”RNN” -solutyyppi, joka välttää katoavan gradienttivaikutuksen. Yksinkertaisemmin se vie sanasarjan ja sen avulla voimme löytää suhteita niiden välillä.

    Nyt viimeinen kerros on Dense mikä tarkoittaa pohjimmiltaan sen tyyppistä matriisia, mikä tarkoittaa, että lähtö on kuin: [probability_is_not_onion, probability_is_onion]. Löytämällä kumpi on suurempi, voimme valita, mikä on luotettavin tulos annetulle otsikolle.

    Vastaa

    Python 3 + Keras, 41/50 = 82%

    83% (166/200) piilotetuissa testitapauksissa

    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.h5 ja vocabulary.json voidaan hakea täältä (erittäin suuri) ja täällä .

    Täysin kytketty luokittelija, joka on liitetty ennalta koulutettuun mielipiteen analyysimalliin DeepMoji, joka koostuu pinotuista kaksisuuntaisista LSTM: istä ja tarkkailumekanismista. Jäädytin DeepMoji-kerrokset ja otin lopullisen softmax-kerroksen, koulutin vain täysin kytketyt kerrokset, sitten sulasin DeepMoji-kerrokset ja koulutin ne yhteen hienosäätöä varten. Tarkkailumekanismi on otettu kohdasta https://github.com/bfelbo/DeepMoji/blob/master/deepmoji/attlayer.py (en halunnut joutua käyttämään kaikkia koodejaan riippuvuutena yhdelle luokalle, varsinkin kun se on Python 2 ja melko hankala käyttää moduulina …)

    Tämä toimii yllättävän huonosti Megon testisarjassa, kun otetaan huomioon, että asetin sen omalla suuremmalla vahvistuksellani saa> 90%. Joten en ole vielä tehnyt tätä.

    Kommentit

    • 83% piilotetuista testitapauksista, olettaen, että suoritin sen oikein

    vastaus

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

    96% (192/200) piilotetuissa testitapauksissa

     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)); };  

    Tämä vaatii kaksi isoa JSON-tiedostoa, joita en voi laittaa tänne tai ” TiO ”. Lataa ne seuraavista linkeistä ja tallenna ne words.json ja nimet, samassa kansiossa kuin JS-tiedosto. Siellä on myös linkki JS-tiedostolle, jossa on testitapauksia ja tulos / prosenttiosuus.Voit laittaa piilotetut testitapaukset onions – ja nonOnions -muuttujiin.

    Kun olet tallentanut kaikki 3 tiedostoa samaan hakemistoon, suorita node onion.js.

    O -funktio palauttaa true jos se on sipuli ja false jos se ei ole ””. Suuren luettelon sanapusseista (ilman järjestystä) havaitaan, onko syötetty merkkijono sipuli. Eräänlainen kovakoodattu, mutta toimii hyvin erilaisissa satunnaisissa testeissä tapauksia.

    Kommentit

    • Tämä ratkaisu saa 96% piilotetuista testitapauksista

    Vastaa

    Arnauldin ratkaisun käyttäminen

    JavaScript (ES6), 41/50

    64% (128/200) piilossa testitapaukset

    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) piilotetuissa testitapauksissa (virheellinen)

    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 

    Pituus + sanamäärä + ”ly ”käsite toimii melko hyvin, pystyin puristamaan vielä muutaman pisteen tarkistamalla sanan” Isä ”(milloin todelliset artikkelit puhuvat ihmisten isistä otsikossa kolmannessa persoonassa?) Ja lisäpisteen muuttamalla ”ly” -hakuuristinen ja numeroiden esiintymisen tarkistaminen otsikossa (mikä saattaa olla vähemmän pätevää testin ulkopuolella, joten jätin molemmat ratkaisut)

    Kommentit

    • En tiedä ’ en tiedä isäosasta … näyttää siltä, että minulle olisi optimoitu testitapausta …
    • Ja kyllä, löydän paljon Ei sipulia -artikkeleita, joissa mainitaan isät
    • Siellä ’ on luultavasti parempi tapa tehdä se osana heuristista eikä vain kova ” win ” jos se sisältää isää, mutta kuvittelen jopa testitietokannan ulkopuolella abstraktisti puhuvan tietystä ” Isä ” on yleisempi sipulilla
    • Ensimmäinen ratkaisusi sai 64% piilotetuista testitapauksista, joten se on kelvollinen. Toinen ratkaisusi sai 62,5% piilotetuista testitapauksista, joten se ei ole kelvollinen.
    • @Mego Mikä lähellä marginaalia …

    Vastaa

    Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *