양파 아니면 양파?


11

양파 (경고 : 많은 기사는 NSFW)는 전통적인 뉴스 매체를 패러디하는 풍자적 뉴스 조직입니다. The Onion은 2014 년에 BuzzFeed와 같은 "clickbait"사이트를 패러디하는 풍자적 인 뉴스 웹 사이트 인 ClickHole (경고 : NSFW)을 시작했습니다 . Poe 's Law 덕분 에 사람들이 The Onion 또는 ClickHole의 기사 헤드 라인을 읽고 그들이 풍자라는 것을 알지 못하고 진실이라고 믿는 것이 일반적입니다. 대화는 또한 어리석게 들리는 실제 뉴스 기사에서도 발생합니다. 사람들은 종종 자신이 그렇지 않을 때 풍자라고 생각합니다.

이 혼란은 자연스럽게 게임에 적합합니다-뉴스 헤드 라인이 주어지면 그것이 풍자인지 아닌지를 추측하십시오. 이 과제는 프로그램으로 정확히 수행하는 것입니다.

뉴스 헤드 라인 (인쇄 가능한 ASCII 문자와 공백으로 만 구성된 문자열)이 주어지면 1헤드 라인이 풍자인지 0아닌지 출력 합니다 . 점수는 올바른 결과 수를 총 헤드 라인 수로 나눈 값입니다.

평소와 같이 표준 허점 (특히 테스트 사례에 최적화 )은 허용되지 않습니다. 이를 시행하기 위해 200 개의 숨겨진 테스트 사례 (The Onion의 100, Not The Onion의 100)에서 프로그램을 실행합니다. 귀하의 솔루션은 유효하기 위해 공개 테스트 사례에서 20 % 이상의 점수를 차지해야합니다.

테스트 사례

이 과제에 대한 테스트 사례를 마련하기 위해 Onion 서브 레딧 에서 25 개의 헤드 라인 (ClickHole과 같은 Onion 및 해당 하위 사이트의 기사가 게시 됨)과 Not The Onion 서브 레딧 에서 25 개의 헤드 라인 (실제 뉴스 기사)을 선택했습니다. 풍자 같은 소리가 게시됩니다). 내가 헤드 라인을 변경 한 유일한 내용은 "팬시"따옴표를 일반 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

6
Your score will be the number of correct outputs divided by the total number of headlines바이트 수는 타이 브레이커입니까?
Skidsdev

9
조금 혼란 스러워요. 어떤 종류의 당신이 솔루션을 기대합니까? 모든 솔루션은 영어를 이해할 수 있고 유머 감각이있는 AI를 작성하여 "테스트 사례를 최적화"해야합니다. 예를 들어 Arnauld의 솔루션은 /ly\b/선택한 25 개의 양파 헤드 라인이 더 많은 부사를 가지고 있기 때문에 어느 것이 작동하는지 감지 하지만 다른 테스트 배터리로 쉽게 트립 할 수 있다는 것을 알고 있습니다. 그리고 그의 계수가 점수를 최적화하도록 선택되지 않았다고 누가 말할까요? (그가 왜 최적화하지 않습니까?)
Lynn

10
이 테스트 배터리는 조금 특이한 것 같습니다. 마치 사진에서 개를 감지 할 수있는 분류기를 요청하는 것과 같지만, "25 마리의 사진은 당신이 개를 맹세 할 것입니다"라는 제목의 Buzzfeed 기사에서 긍정적 인 테스트 사례를 개와 부정적인 테스트 사례로 찍는 것과 같습니다. "그들은 그렇지 않다!"(# 11은 당신의 마음을 날려 버릴 것입니다!) "
Sophia Lechner

4
도전은 어려울뿐만 아니라 차이점이 무엇인지 (나에게도) 분명하지 않습니다. 내가 그것을 해결할 수 없다면, 물론 내 프로그램은 그것을 해결할 수 없다 (즉, 테스트 케이스를 위해 하드 코딩하지 않았다는 것을 확신시키는 동안)
user202729

4
글쎄, 나는 brain.js이 문제의 샘플과 제공된 링크에서 각 유형의 100 개의 다른 샘플을 사용 하여 LSTM을 사용하여 인공 신경망을 훈련하는 데 +36 시간을 보냈지 만 결과는 훈련 세트에 없었던 새로운 제목으로는 충분하지 않았습니다. . 완료 : P
Night2

답변:


7

자바 스크립트 (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

온라인으로 사용해보십시오!


이것은 얼마나 간단한 지에 대해 터무니없이 효과적입니다.
Don Thousand

이 솔루션은 숨겨진 테스트 사례에서 63.5 %의 점수를 얻었으므로 유효합니다.
Mego

샌드 박스 초기에 가능한 한 단순하지는 않지만 (100 %, 표준화되기 전에 대문자 사용 차이를 이용함) 이것은 매우 간단합니다.
Zacharý

@Mego이 NSFW 버전 은 호기심 때문에 숨겨진 테스트 사례에서 점수를 향상 시킵 니까? :)
Arnauld

해당 버전의 @Arnauld 66 %
Mego

6

파이썬 3, 84 %

숨겨진 테스트 사례에서 테스트되지 않았습니다.

여기에는 다양한 헤드 라인에 대해 훈련 된 Keras LSTM RNN이 사용됩니다. 그것을 실행하려면 Keras가 필요하며 GitHub에서 사용할 수있는 모델 : repo link . 모델이 필요하고 .h5단어 / 벡터 매핑이에 .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. 이러한 삽입은 실제 단어 사이가 아니라 .pkl파일에 저장된 단어를 나타내는 숫자 사이에 발생 합니다. 기계가 이해하지 못하는 단어는 특별한 단어에 매핑되어있어 <UNK>거기에 단어가 있지만 그 의미가 정확히 무엇인지는 알 수 없습니다.

단어를 이해할 수있게되었으므로 단어 순서 (헤드 라인)를 분석 할 수 있어야합니다. 이것이 바로 'LSTM'이하는 것입니다. LTSM은 사라지는 기울기 효과를 피하는 일종의 'RNN'셀입니다. 더 간단히 말하면, 그것은 일련의 단어를 취하며 우리가 그들 사이의 관계를 찾을 수있게합니다.

이제 마지막 레이어는 Dense기본적으로 출력과 같은 의미의 배열과 같은 것을 의미합니다 [probability_is_not_onion, probability_is_onion]. 어느 것이 더 큰지 찾아서 주어진 헤드 라인에 가장 자신감있는 결과를 선택할 수 있습니다.


3

파이썬 3 + 케 라스, 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 에서 가져 왔습니다 (특히 모든 클래스를 한 클래스의 종속성으로 사용하고 싶지는 않았습니다. 파이썬 2와 모듈로 사용하기가 다소 까다 롭습니다 ...)

이것은 더 큰 검증 세트가 90 % 이상이된다는 것을 고려할 때 Mego의 테스트 세트에서 놀랍게도 성능이 떨어집니다. 아직 끝나지 않았습니다.


내가 올바르게 실행했다고 가정하면 숨겨진 테스트 사례에서 83 %
Mego

1

자바 스크립트 ( 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"에 넣을 수없는 두 개의 큰 JSON 파일이 필요합니다. 다음 링크에서 다운로드하여 JS 파일과 동일한 폴더에 words.jsonbags.json이름으로 저장 하십시오. 테스트 사례 및 결과 / 퍼센트 인쇄가 포함 된 JS 파일에 대한 링크도 있습니다. 숨겨진 테스트 사례 onionsnonOnions변수를 넣을 수 있습니다 .

3 개의 파일을 모두 같은 디렉토리에 저장 한 후을 실행하십시오 node onion.js.

O기능은 반환 true은 양파 인 경우와 false그렇지 않은 경우. 입력 된 문자열이 양파인지 감지하기 위해 큰 단어 백 (순서없이)을 사용합니다. 하드 코딩 된 종류이지만 다양한 임의 테스트 사례에서 매우 잘 작동합니다.


이 솔루션은 숨겨진 테스트 사례에서 96 %를 얻습니다
Mego

0

Arnauld의 솔루션 작업

자바 스크립트 (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

자바 스크립트 (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"개념은 꽤 잘 작동합니다. 나는 "아빠"라는 단어를 확인하여 몇 가지 더 많은 지적을 할 수있었습니다. "ly"검색 휴리스틱을 변경하고 제목에 숫자가 있는지 확인하여 추가 포인트 (일반적으로 테스트 외부에서는 유효하지 않을 수 있으므로 두 솔루션 모두 남았습니다)


나는 아빠 부분에 대해 모른다 ... 나에게 테스트 사례를 최적화하는 것처럼 보인다 ...
Don Thousand

그리고 네, 아빠를 언급 한 양파가 아닌 기사가 많이 있습니다
Don Thousand

휴리스틱의 일부가 아닌 하드가 아빠가 포함되어있는 경우 "승리"하지만 심지어 외부 테스트 데이터베이스가 추상적으로 "아빠"양파에 대한 공통 인 특정에 대해 이야기 상상을 할 수있는 더 좋은 방법은 아마도있다
TiKevin83은

숨겨진 테스트 사례에서 첫 번째 솔루션의 점수가 64 %이므로 유효합니다. 숨겨진 테스트 사례에서 두 번째 솔루션의 점수가 62.5 %이므로 유효하지 않습니다.
Mego

@Mego 무엇 가까운 마진 ...
user202729
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.