A hagyma, vagy nem a hagyma?

A hagyma (figyelmeztetés: sok cikk NSFW) egy szatirikus hírszervezet, amely parodizálja a hagyományos hírmédiát. 2014-ben a The Onion elindította a ClickHole (figyelmeztetés: gyakran NSFW is) szatirikus hírwebhelyet, amely olyan “clickbait” webhelyeket parodizál, mint a BuzzFeed. A Poe Törvénynek köszönhetően meglehetősen gyakori, hogy az emberek elolvassák a The Onion vagy a ClickHole cikkek címsorát, és igaznak hiszik őket, nem tudva hogy szatírának szánják őket. Nevetséges hangzású, valódi hírekkel is fordulunk elő – az emberek gyakran azt gondolják, hogy szatírák, amikor nem.

Ez a zűrzavar természetesen játéknak is megfelelő – egy hír címsorában próbáld meg kitalálni, hogy nem szatíra. Ez a kihívás arról szól, hogy pontosan ezt tegye meg egy programmal.

Ha egy hír címsort (csak nyomtatható ASCII karakterekből és szóközökből álló karakterláncot tartalmaz), akkor adja ki a 1 parancsot, ha címsor szatíra, vagy 0, ha nem az. Az Ön pontszáma a helyes kimenetek száma lesz elosztva a címsorok teljes számával.

A szokásos módon szabványos kiskapuk (különösen optimalizálás a tesztesetekhez ) nem megengedett. Ennek kikényszerítése érdekében futtatom a programokat 200 rejtett tesztesettel (100 a The Onion, 100 a The The Onion). Megoldásának legfeljebb 20 százalékponttal kell kevesebbet elérnie, mint a nyilvános teszteseményeken elért pontszáma, hogy érvényes legyen.

Tesztesetek

Teszteseteket kell kidolgozni ehhez a kihíváshoz. , 25 címsort választottam a The Onion subreddit oldalról (ahová a The Onion és gyermekoldalainak cikkei kerülnek fel, például a ClickHole), és 25 címsort a a Not The Onion subbreddit (ahol valódi, szatírának tűnő hírcikkeket tesznek közzé). Az egyetlen változtatás, amelyet a címsorokban hajtottam végre, a “divatos” idézetek helyettesítése a szokásos ASCII idézetekkel és a kis- és nagybetűk egységesítése – minden más változatlan marad az eredeti cikk címsoránál. Minden címsor a saját sorában van.

A hagyma címsorai

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 

Nem a hagyma címsorai

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 

Megjegyzések

  • Your score will be the number of correct outputs divided by the total number of headlines A bájtszám döntetlen?
  • I ‘ ma kicsit zavart. Milyen fajta megoldásra számít? Minden megoldást ” optimalizálnia kell a ” kissé tiltja az angolul értő és humorérzékű mesterséges intelligencia írását. Például Arnauld ‘ s megoldása felismeri a /ly\b/ ami csak azért működik, mert a 25 Onio n a kiválasztott címsorokban előfordulhat, hogy több mellékmondat van, de mindent tudok, hogy könnyen megkísérelheti egy másik tesztelemmel. És ki mondja ki ‘, hogy az együtthatói nem ‘ t választják a pontszámának optimalizálására? (Miért ne optimalizálná őket? Div id = “b4594fe07e”>

?)

  • Ez a teszt akkumulátor kissé szokatlannak tűnik. ‘ tetszik olyan osztályozót kérni, amely képes felismerni a kutyákat egy fényképen, de a pozitív teszteseteket kutyaképként veszi fel, a negatív teszteseteit pedig a Buzzfeed ” 25 objektum fényképe t! (# 11 el fogja robbantani az elmédet!) ” Ez egy elég nehéz problémát megnehezít.
  • Nem csak a kihívás nehéz, de ‘ nem is nyilvánvaló (számomra) mi a ‘ s a különbség. Ha ‘ nem tudom megoldani, akkor természetesen a programom nem tudja megoldani (vagyis meggyőzni arról, hogy nem ‘ t hardcode a tesztesetekhez)
  • Nos, +36 órát töltöttem egy mesterséges ideghálózat edzésével a brain.js és LSTM, ebben a számban és 100 más mintával, mindegyik típusból a megadott linkekből, de az eredmény nem volt elég jó új címekkel, amelyek ‘ nincsenek jelen az edzőkészletekben. ‘ kész: P
  • Válasz

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

    63,5% (127/200) rejtett teszteseteknél

    Egyszerű heurisztika a cím hossza, a szóközök száma és a a -ly utótag használata.

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

    Próbálja ki online!

    Megjegyzések

    • Ez abszurd módon hatékony, mennyire egyszerű.
    • Ez a megoldás 63,5% -ot ért el a rejtett tesztesetek, így érvényes.
    • Nem olyan egyszerű, mint amilyen a homokozó elején lehetséges volt (100%, a kis- és nagybetűs különbségeket kihasználva a szabványosítás előtt), de ez nagyon egyszerű.
    • @Mego Csak kíváncsiságból javítja ez az NSFW verzió a rejtett tesztesetek pontszámát? 🙂
    • @Arnauld 66% ezzel a verzióval

    Válasz

    Python 3, 84%

    Nem tesztelt rejtett teszteseteken.

    Ez a különféle címsorokra betanított Keras LSTM RNN-t használja. A futtatásához szüksége van Kerasra és a következő modellre, amelyet elérhetővé tettem a GitHub-on: repo link . Szüksége lesz a és a szó / vektor leképezések .pkl fájlban vannak. A legújabb

    A függőségek a következők:

    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 

    A beállítások a következők:

    max_headline_length = 70 word_count = 20740 

    A modell:

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

    Most a modell és a beágyazások beillesztéséhez:

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

    És a teszteléshez szükséges kódot, ha egy karakterlánc a “NotTheOnion” vagy a “TheOnion” származik “Írtam egy gyors segítő függvényt, amely átalakítja a karakterláncot a szó beágyazásává:

    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 

    Magyarázat

    Ez a kód egy modell, amely a szavak közötti kapcsolatokat úgy elemzi, hogy a szavakat “vektorként” ábrázolja. A szó beágyazásáról itt tudhat meg többet.

    Ezt fejléceken oktatják, de a tesztesetek ki vannak zárva .

    Ez a folyamat elég sok feldolgozás után automatizálódik. A végleges feldolgozott szólistát .pkl néven terjesztettem, de ami a szó beágyazásakor történik, először elemezzük a mondatot és elkülönítjük a szavakat.

    Miután most a szavakkal a következő lépés az, hogy megértsük az egyes szavak közötti különbségeket és hasonlóságokat, pl. king és queen versus duke és duchess. Ezek a beágyazások nem a tényleges szavak, hanem a szavakat reprezentáló számok között történnek, ami a fájl. Azok a szavak, amelyeket a gép nem ért, egy speciális <UNK> szóhoz vannak hozzárendelve, amely lehetővé teszi számunkra, hogy megértsük, hogy van ott egy szó, de nem pontosan tudjuk, mi a jelentése.

    Most, hogy a szavak megérthetők, elemezni kell a szavak sorrendjét (címsor). Ezt teszi az “LSTM”, az LTSM az “RNN” típusú cella, elkerüli az eltűnő gradiens hatást. Egyszerűbben, egy szósorozatot vesz fel, és lehetővé teszi számunkra, hogy kapcsolatokat találjunk közöttük.

    Most az utolsó réteg Dense ami alapvetően azt jelenti, hogy egyfajta tömb, vagyis a kimenet olyan, mint: [probability_is_not_onion, probability_is_onion]. Megtalálva, melyik nagyobb, kiválaszthatjuk, hogy melyik legyen a legbiztosabb eredmény az adott címsorhoz.

    Válasz

    Python 3 + Keras, 41/50 = 82%

    83% (166/200) rejtett teszteseteknél

    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 és vocabulary.json itt (nagyon nagy) és itt .

    Teljesen összekapcsolt osztályozó egy előre kiképzett hangulatelemző modellhez csatlakozik, a DeepMoji, amely halmozott kétirányú LSTM-ekből és figyelmi mechanizmusból áll. Fagyasztottam a DeepMoji rétegeket, és kivettem a végső softmax réteget, csak a teljesen összekapcsolt rétegeket képeztem ki, majd feloldottam a DeepMoji rétegeket és együtt képeztem ki őket a finomhangoláshoz. A figyelem mechanizmusa a következőből származik: https://github.com/bfelbo/DeepMoji/blob/master/deepmoji/attlayer.py (nem akartam, hogy az összes kódjukat függőségként kell használni egy osztály számára, főleg, hogy Python 2, és meglehetősen nehézkes modulként használni …)

    Ez meglepően gyengén teljesít a Mego tesztkészletén, tekintve, hogy a saját nagyobb érvényesítésemnél állítottam be > 90% -ot kap. Tehát még nem értem el ezzel.

    Megjegyzések

    • 83% rejtett tesztesetekre, feltéve, hogy jól futtattam

    Válasz

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

    96% (192/200) rejtett teszteseteknél

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

    Ehhez két nagy JSON fájlra van szükség, amelyeket “nem tudok ide tenni, vagy ide rakni ” TiO “. Töltse le őket a következő linkekről, és mentse el őket a words.json és a nevek, ugyanabban a mappában, mint a JS fájl. Van egy link egy JS fájlhoz, amely tartalmazza a teszteseteket és az eredmény / százalékos nyomtatást.A rejtett teszteseteket elhelyezheti onions és nonOnions változókban.

    Miután mindhárom fájlt elmentette ugyanabba a könyvtárba, futtassa a .

    A O függvény visszaadja true ha ez hagyma és false ha nem “t”. A szózsákok nagy listáját használja (sorrend nélkül) annak észlelésére, hogy a beviteli karakterlánc hagymás. Kemény kódolású, de nagyon jól működik különféle véletlenszerű teszteken esetek.

    Megjegyzések

    • Ez a megoldás a rejtett tesztesetek 96% -át kapja

    Válasz

    Arnauld megoldásának kidolgozása

    JavaScript (ES6), 41/50

    64% (128/200) rejtetten tesztesetek

    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) a rejtett teszteseteknél (érvénytelen)

    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 

    A hosszúság + szószám + “ly “a koncepció elég jól működik, tudtam még néhány pontot kipréselni azzal, hogy megvizsgáltam az” Apa “szót (amikor a valódi cikkek az emberek apáiról beszélnek a címben szereplő harmadik személyben?) és egy további pontot azáltal, hogy megváltoztattam a “ly” keresési heurisztika és a címben szereplő számok ellenőrzése (ami általában kevésbé érvényes a teszten kívül, ezért mindkét megoldást hagytam)

    Megjegyzések

    • Nem tudok ‘ nem tudok az apa részéről … nekem egy kicsit úgy tűnik, mintha a tesztesetet optimalizálnám …
    • És igen, rengeteg Nem hagyma cikket találok, amelyek apákat említenek
    • Ott ‘ valószínűleg jobb módszer a heurisztika részeként. és nem csak egy kemény ” win ” ha apát tartalmaz, de elképzelhetőnek tartom, hogy még a tesztadatbázison kívül is elvontan beszélünk egy adott

    Apa ” gyakoribb a Hagymánál

  • Az első megoldásod 64% -ot ért el a rejtett teszteseteken, tehát érvényes. Második megoldásod 62,5% -ot ért el a rejtett teszteseteken, tehát nem érvényes.
  • @Mego Milyen szoros különbség van …
  • Vélemény, hozzászólás?

    Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük