The Onion (경고 : 많은 기사가 NSFW 임)은 다음과 같은 풍자적 인 뉴스 조직입니다. 전통적인 뉴스 미디어를 패러디합니다. 2014 년 The Onion은 BuzzFeed와 같은 “클릭 베이트”사이트를 패러디 한 풍자적 인 뉴스 웹 사이트 인 ClickHole (경고 : 자주 NSFW)을 시작했습니다. Poe의 법칙 덕분에 사람들이 The Onion 또는 ClickHole의 기사 헤드 라인을 읽고 그것이 사실이라고 믿고 알지 못하는 경우가 많습니다. 풍자를 의도 한 것입니다. 대화는 말도 안되게 들리는 실제 뉴스 이야기에서도 발생합니다. 사람들은 종종 그들이 그렇지 않을 때 풍자라고 생각한다고 생각합니다.
이 혼란은 자연스럽게 게임에 적합합니다. 뉴스 헤드 라인이 주어지면 그 여부를 추측 해보십시오. 풍자가 아닙니다. 이 문제는 프로그램으로 정확히 수행하는 것입니다.
뉴스 헤드 라인 (인쇄 가능한 ASCII 문자와 공백으로 만 구성된 문자열)이 주어지면 1
를 출력합니다. 헤드 라인은 풍자이거나 그렇지 않은 경우 0
입니다. 점수는 정확한 출력 수를 총 헤드 라인 수로 나눈 값입니다.
평소처럼 표준 허점 (특히 테스트 사례 최적화 )는 허용되지 않습니다. 이를 시행하기 위해 200 개의 숨겨진 테스트 케이스 (The Onion에서 100 개, Not The Onion에서 100 개) 세트에서 프로그램을 실행합니다. 솔루션이 유효하려면 공개 테스트 사례의 점수보다 20 % 미만의 점수를 받아야합니다.
테스트 사례
이 과제에 대한 테스트 사례를 제시하려면 , 저는 The Onion subreddit (The Onion 및 ClickHole과 같은 하위 사이트의 기사가 게시 된 기사)에서 25 개의 헤드 라인과
Not The Onion 서브 레딧 (풍자처럼 들리는 실제 뉴스 기사가 게시 됨). 내가 헤드 라인을 변경 한 것은 “멋진”따옴표를 일반 ASCII 따옴표로 바꾸고 대소 문자를 표준화하는 것이 었습니다. 나머지는 모두 원본 기사의 헤드 라인에서 변경되지 않고 그대로 유지됩니다. 각 헤드 라인은 고유 한 줄에 있습니다.
Onion 헤드 라인
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
Not The Onion 헤드 라인
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
댓글
테스트 사례를 위해 하드 코딩하지 않음)
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 LSTM RNN을 사용합니다. 이를 실행하려면 Keras가 필요하고 GitHub에서 제공 한 모델 인 repo 링크 가 필요합니다. 모델 및 단어 / 벡터 매핑은 .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
로 배포했지만 단어 임베딩에서 일어나는 일은 먼저 문장을 분석하고 단어를 분리하는 것입니다.
이제 이후에 다음 단계는 특정 단어 간의 차이점과 유사점을 이해할 수 있도록하는 것입니다 (예 : king
및 queen
대 duke
및 duchess
. 이러한 임베딩은 실제 단어 사이가 아니라 파일. 기계가 이해하지 못하는 단어는 특수 단어 <UNK>
에 매핑되어 단어가 있지만 그 의미가 정확히 무엇인지 알 수 없다는 것을 이해할 수 있습니다.
이제 단어를 이해할 수 있으므로 단어의 순서 (headline)를 분석 할 수 있어야합니다. 이것이 “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.h5
및 vocabulary.json
는 여기 (매우 큼) 및
여기 .
사전 훈련 된 정서 분석 모델 DeepMoji에 연결된 완전 연결 분류기, 누적 양방향 LSTM 및주의 메커니즘으로 구성됩니다. 저는 DeepMoji 레이어를 동결하고 최종 소프트 맥스 레이어를 꺼내 완전히 연결된 레이어 만 훈련 한 다음 DeepMoji 레이어를 고정 해제하고 미세 조정을 위해 함께 훈련했습니다. 주의 메커니즘은 https://github.com/bfelbo/DeepMoji/blob/master/deepmoji/attlayer.py 에서 가져 왔습니다 (모든 코드를 종속성으로 사용하고 싶지 않았습니다. 한 클래스에 대해, 특히 “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
변수에 넣을 수 있습니다.
- words.json
- bags.json
- onion.js (기본 테스트 케이스 포함)
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”검색 휴리스틱 및 제목에 숫자가 있는지 확인 (테스트 외부의 일반적인 경우에는 유효하지 않을 수 있으므로 두 솔루션을 모두 남겼습니다)
코멘트
- 아빠 부분에 대해 잘 모르겠습니다. ‘ … 테스트 케이스를 최적화하는 것과 비슷합니다 …
- 예, 아빠를 언급하는 Not the Onion 기사를 많이 찾을 수 있습니다.
- 휴리스틱의 일부로이를 수행하는 더 좋은 방법이 ‘있을 수 있습니다. 그리고 단지 어려운 ” 아빠가 포함 된 경우 ” 승리하지만 테스트 데이터베이스 외부에서도 특정 ” Dad “는 The Onion에서 더 일반적입니다.
- 첫 번째 솔루션은 숨겨진 테스트 케이스에서 64 %를 기록 했으므로 유효합니다. 두 번째 솔루션은 숨겨진 테스트 사례에서 62.5 %를 기록 했으므로 유효하지 않습니다.
- @Mego 얼마나 가까운 마진 …
Your score will be the number of correct outputs divided by the total number of headlines
bytecount는 타이 브레이커입니까?/ly\b/
25 Onio가 당신이 고른 헤드 라인에는 더 많은 부사가 있지만, 다른 테스트 배터리로 쉽게 넘어갈 수 있다는 것을 알고 있습니다. 그리고 그의 계수가 점수를 최적화하도록 선택되지 않았다고 ‘ 누구 ‘? (왜 ‘ 최적화하지 않습니까?)25 장의 사물 사진 ‘ 개는 맹세하지만 개는 아닙니다. ‘ 티! (# 11 Will Blow Your Mind!) ” 충분히 어려운 문제를 더 어렵게 만듭니다.