GMail имеет эту функцию, где он будет предупреждать вас, если вы попытаетесь отправить электронное письмо, которое, по его мнению, может иметь вложение.
Поскольку GMail обнаружил строку see the attached
в электронном письме, но фактического вложения не было, он предупреждает меня с помощью диалогового окна OK / Отмена, когда я нажимаю кнопку Отправить.
У нас есть проблема, связанная с переполнением стека. То есть, когда пользователь вводит сообщение, подобное этому :
моя проблема в том, что мне нужно изменить базу данных, но я не буду создавать новое соединение. пример: DataSet dsMasterInfo = new DataSet (); База данных db = DatabaseFactory.CreateDatabase ("ConnectionString"); DbCommand dbCommand = db.GetStoredProcCommand ("uspGetMasterName");
Этот пользователь не форматировал свой код как код!
То есть они не делали отступ на 4 пробела на Markdown и не использовали кнопку кода (или сочетание клавиш ctrl+ k), которое делает это для них.
Таким образом, наша система принимает много правок, в которые люди должны войти и вручную отформатировать код для людей, которые каким-то образом не могут понять это. Это приводит к большой боли в животе . Мы несколько раз улучшали помощь редактора, но если не подъезжать к дому пользователя и нажимать для него правильные кнопки на клавиатуре, мы не можем понять, что делать дальше.
Вот почему мы рассматриваем предупреждение в стиле Google GMail:
Вы хотели разместить код?
Вы написали материал, который, по нашему мнению, выглядит как код, но вы не отформатировали его как код, сделав отступ в 4 пробела, используя кнопку кода панели инструментов или команду ctrl+ kcode formatting.
Однако представление этого предупреждения требует, чтобы мы обнаружили наличие в вопросе того, что мы считаем неформатированным кодом . Каков простой, полу-надежный способ сделать это?
- В соответствии с Markdown , код всегда имеет отступ в 4 пробела или в обратных кавычках, поэтому все правильно отформатированные данные могут быть немедленно исключены из проверки.
- Это всего лишь предупреждение, и оно будет применяться только к пользователям с низкой репутацией, задающим свои первые вопросы (или предоставляющим свои первые ответы), поэтому некоторые ложные срабатывания в порядке, если они составляют около 5% или менее.
- Вопросы о переполнении стека могут быть на любом языке, хотя мы можем реально ограничить нашу проверку, скажем, языками «большой десятки». На странице тегов это будет C #, Java, PHP, JavaScript, Objective-C, C, C ++, Python, Ruby.
- Используйте дамп данных Creative Commons переполнение стека для аудита вашего потенциального решения (или просто выберите несколько вопросов в топ-10 тегов на переполнение стека) и посмотреть, как это происходит.
- Псевдокод в порядке, но мы используем c #, если вы хотите быть более дружелюбным.
- Чем проще, тем лучше (пока это работает). ПОЦЕЛУЙ! Если ваше решение требует, чтобы мы попытались скомпилировать посты в 10 различных компиляторах, или группа людей, чтобы вручную обучить механизм байесовского вывода, это ... не совсем то, что мы имели в виду.
Ответы:
Правильным решением, вероятно, будет некоторая обученная / статистическая модель, но вот несколько забавных идей:
myFunc()
foo.bar = ptr->val
while (true) { bar[i]; }
/* multi-line comment */
+, *, &, &&, |, ||, <, >, ==, !=, >=, <=, >>, <<, ::, __
Можно отслеживать, сколько раз каждый из них появляется, и их можно использовать в качестве функций в алгоритме машинного обучения, таком как персептрон , как это делает SpamAssassin.
источник
SELECT DISTINCT name FROM people WHERE id IS NOT NULL
.Мне было бы любопытно посмотреть, каковы средние показатели написанного английского с одной стороны, и кода с другой стороны.
Может быть, это уже могло бы провести различие между кодом и остальным. По крайней мере, я полагаю, что код, независимо от языка, будет показывать некоторые заметно отличающиеся показатели во многих случаях.
Хорошая новость: у вас уже есть достаточно данных для построения вашей статистики.
Хорошо, я вернулся с некоторыми данными, чтобы подтвердить свои предположения. :-)
Я сделал быстрый и грязный тест на собственном посте и на первый пост я нашел на StackOverflow , с довольно продвинутым инструментом:
wc
.Вот что я имел после выполнения
wc
текстовой части и части кода этих двух примеров:Сначала давайте посмотрим на английскую часть :
Довольно похоже не так ли?
Теперь давайте посмотрим на часть кода !
Посмотрите, насколько эти метрики не так отличаются, но, что более важно, насколько они отличаются от английских метрик? И это только с помощью ограниченного инструмента. Теперь я уверен, что вы можете получить что-то действительно точное, измеряя больше метрик (я имею в виду, в частности, статистику символов).
Я могу испечь печенье?
источник
Как правило, цепи Маркова используются для генерации текста, но они также могут использоваться для прогнозирования сходства текста (в соответствии с CE Shannon 1950 ) с обученной моделью. Я рекомендую несколько цепей Маркова.
Для каждого распространенного языка обучите марковскую цепочку на большой репрезентативной выборке кода на языке. Затем для публикации переполнения стека, для которой вы хотите обнаружить код, выполните следующие действия для каждой из цепочек:
Для каждой строки вы должны иметь значение ACTUAL и HIGHEST. Разделите ФАКТИЧЕСКИЙ на ВЫСОКИЙ. Это даст вам оценку пригодности относительно того, является ли конкретная строка исходным кодом. Это связывает число с каждой из строк в приведенном вами примере:
Наконец, вам нужно выбрать порог, чтобы определить, когда в посте есть код. Это может быть просто число, выбранное наблюдением, которое дает высокую производительность. Также может учитываться количество строк с высокой оценкой.
Тренировка
Для обучения приобретите большой репрезентативный образец кода на языке. Напишите программу для циклического перемещения по кодовому тексту и сопоставьте каждый N-грамм в файле (диапазон для N должен быть параметризован) со статистической частотой последующего символа. Это приведет к множеству возможных состояний символов, следующих за биграммой, каждое из которых связано с вероятностью. Например, биграмма "()" может иметь следующие вероятности символов:
Первый должен читаться, например, как «Вероятность того, что точка с запятой следует за пустой круглой скобкой, равна 0,5».
Для тренировок я рекомендую N-грамм размера от двух до пяти. Когда я проводил некоторые исследования по этому вопросу , мы обнаружили, что N-граммы размера от двух до пяти хорошо работали на английском языке. Поскольку большая часть исходного кода похожа на английский, я бы посоветовал начать с этого диапазона и затем настроить его, чтобы найти оптимальные значения параметров, когда вы найдете то, что работает.
Предостережение: на модель будут влиять идентификаторы, имена методов, пробелы и т. Д. Однако вы можете настроить тренировку так, чтобы пропустить определенные функции обучающей выборки. Например, вы можете свернуть все ненужные пробелы. Наличие пробелов во входных данных (сообщение переполнения стека) также можно игнорировать. Вы также можете игнорировать алфавитный регистр, который был бы более устойчивым перед лицом различных соглашений об именовании идентификаторов.
Во время моего исследования мы обнаружили, что наши методы хорошо работают как для испанского, так и для английского языка. Я не понимаю, почему это не сработает и для исходного кода. Исходный код даже более структурирован и предсказуем, чем человеческий язык.
источник
Могу ли я предложить принципиально иной подход? В SO единственным допустимым человеческим языком является английский, поэтому все, что не является английским, имеет 99,9% шансов быть фрагментом кода .
Поэтому мое решение будет таким: используйте один из множества средств проверки английского языка (просто убедитесь, что они также сигнализируют - помимо ошибок с орфографическими ошибками - синтаксические ошибки, такие как двойные точки, или неязыковые символы, такие как
#
или~
). Тогда любая строка / параграф, который выбрасывает большое количество ошибок и предупреждений, должна вызывать "это код?" вопрос.Этот подход также может быть адаптирован для тех сайтов StackExchange, которые используют другие языки, кроме английского, конечно.
Просто мои 2 ¢ ...
источник
Я, вероятно, получу несколько голосов за это, но я думаю, что вы подходите к этому с неправильной точки зрения.
Эта строка досталась мне:
ИМО, эта точка зрения довольно высокомерна. Я нахожу это много в дизайне программного обеспечения, когда программисты и дизайнеры раздражаются пользователями, которые не могут понять, как правильно использовать программное обеспечение, когда проблема не в пользователе, а в самом программном обеспечении или, по крайней мере, в интерфейсе пользователя.
Основной причиной этой проблемы является не пользователь, а тот факт, что им не очевидно, что они могут это сделать.
Как насчет изменения в пользовательском интерфейсе, чтобы сделать это более очевидным? Наверняка это будет:
Пример:
источник
{}
кнопки вокруг текстового поля может быть достаточно.Псевдокод будет представлять собой реальную проблему, потому что все языки программирования зависят от специальных символов, таких как '[],'; ',' () 'и т. Д. Просто посчитайте вхождение этих специальных символов. Точно так же, как вы обнаружили бы двоичный файл (более 5% выборки содержит значение байта 0).
источник
Я думаю, что вам может потребоваться нацелиться на это только для определенных языков, в общем, эта проблема, вероятно, трудно решаема, поскольку вы можете получить языки, которые очень похожи на английский (например, inform7 ). но, к счастью, наиболее используемые из них могут быть покрыты довольно легко.
Моим первым шагом было бы найти последовательность "; \ n", которая бы хорошо подходила для C, C ++, Java, C # и любого другого языка, который использует похожий синтаксис и действительно прост. Это также менее вероятно, будет использоваться на английском языке, чем; без перевода строки
источник
Кто-то упоминал, что смотрел на теги, а затем искал синтаксис для этого, но он был сбит, потому что он нацелен на новых пользователей.
Возможно, лучшим решением было бы поискать названия языков в основной части вопроса, а затем применить ту же стратегию. Если я упомяну «Javascript», «Java» или «C #», то, скорее всего, именно в этом и заключается вопрос, и код в вопросе, вероятно, будет на этом языке.
источник
Во-первых, запустите его через проверку орфографии, он найдет очень мало правильных английских слов, однако должно быть много слов, которые система проверки правописания предложит разделить.
Тогда есть знаки препинания / специальные символы, не типичные для простого английского языка, типичные для кода:
something();
просто не может быть простым английским языком;$something
гдеsomething
не все числовые;->
между словами без пробелов;.
между словами без пробела;Конечно, чтобы это работало хорошо, вы можете захотеть иметь байесовский классификатор, построенный на основе этих характеристик.
источник
Есть несколько наборов языков с одинаковым синтаксисом. На большинство языков повлияло несколько языков, поэтому языки [AMPL, AWK, csh, C ++, C--, C #, Objective-C, BitC, D, Go, Java, JavaScript, Limbo, LPC, Perl, PHP, Pike, Processing [все были под влиянием C, поэтому, если вы обнаружите C, вы, вероятно, обнаружите все эти языки. так что вам нужно всего лишь написать простой шаблон для обнаружения этого языкового набора.
я также разделил бы текст на блоки, потому что большая часть кода будет разделена двумя новыми строками или подобными от других текстовых блоков в посте.
это легко сделать с помощью javascript (очень простой неполный пример для семейства c):
источник
Просто посчитайте слова / знаки препинания для каждой строки. Английский будет иметь 4 или более, код меньше 2.
Например, в абзаце выше 18 слов и 4 знака препинания. Этот пункт имеет 19 слов и 4 пунктуации, поэтому в пределах ожиданий.
Конечно, это должно быть проверено на вопросы начинающих плохо говорящих по-английски, и, возможно, в этих случаях статистика искажается.
Я ожидаю, что [non-whitespace]. [Whitespace or newline] очень редко встречается в коде, но распространено в английском, так что это можно считать словами, а не пунктуацией.
Я думаю, что самой большой проблемой будет встроенный код, где кто-то задает такой вопрос:
Это код и английский, и должны быть помечены как обратные галочки:
источник
Я думаю, что вы должны сначала провести различие между (достаточно) отформатированным кодом, который нужно только фактически обозначить как таковой, и (слишком) плохо отформатированным кодом, который в любом случае требует ручного форматирования.
Отформатированный код имеет разрывы и отступы. То есть: если перед строкой стоит один разрыв, у вас есть хороший кандидат. Если над ним стоят пробелы, у вас есть очень хороший кандидат.
В обычном тексте для форматирования используются две или две строки перерыва и одна линия перерыва, поэтому существует четкий критерий различия.
В коде LISP вы не найдете точки с запятой, в коде Ruby вы не можете найти круглые скобки, в псевдокоде вы можете вообще ничего не найти. Но на любом (не эзотерическом) языке вы найдете приличный код, отформатированный с помощью разрывов и отступов. Нет ничего более универсального, чем это. Потому что в конце код написан для чтения людьми.
Итак, во-первых, поиск потенциальных строк кода . Кроме того, строки кода обычно приходят группами. Если у вас есть, есть хороший шанс, что тот, что выше или ниже, также является строкой кода.
После того как вы выделили потенциальные строки кода, вы можете проверить их по количественным критериям и выбрать некоторый порог :
Кроме того, теперь, когда есть программисты и cs, область действия stackoverflow явно сужена. Можно рассмотреть возможность обозначения всех языковых тегов как языков. А при публикации вас попросят либо выбрать хотя бы один языковой тег, либо выбрать
language-agnostic
тег, либо явно пропустить его.В первом случае вы знаете, какие языки искать, во втором случае вам может понадобиться поиск псевдокода, а в последнем случае, вероятно, не будет никакого кода, потому что это вопрос, связанный с какой-либо технологией или рамки или такие.
источник
Вы можете создать парсер для каждого языка, который вы хотите обнаружить (определения языка для ANTLR обычно легко найти), а затем пропустить каждую строку вопроса через каждый парсер. Если какая-либо строка анализируется правильно, у вас, вероятно, есть код.
Проблема заключается в том, что некоторые предложения на английском (естественном языке) могут анализироваться как код, поэтому вы можете включить некоторые другие идеи или ограничить положительные результаты, только если более одной или двух последовательных строк правильно анализируются с тот же синтаксический анализатор языка.
Другая потенциальная проблема состоит в том, что это, вероятно, не поднимет псевдокод, но это может быть хорошо.
источник
Что может оказаться наиболее перспективным и потребовать наименьшей ручной корректировки в долгосрочной перспективе, так как другие языки (которые выглядят несколько иначе, чем языки программирования, используемые в настоящее время) становятся более популярными, а используемые в настоящее время языки становятся менее популярными, - это сделать что-то вроде того, что делает Google Translate (см. параграф «Как это работает?»), вместо того, чтобы искать определенные вещи, такие как ab и a () и т. д.
Другими словами, вместо того, чтобы вручную думать о шаблонах, найденных в коде, который нужно искать, компьютер может сам разобраться в этом . Это можно сделать, имея
много кода на разных языках программирования
Предложение: автоматически брать образцы кода из веб-хранилищ исходного кода, таких как Google Code или Github, или даже из вещей в Stackoverflow, уже помеченных как код
Примечание: это может быть хорошей идеей для анализа комментариев кода
много английского текста взяты из статей в сети
и наличие некоторого алгоритма для автоматического поиска в коде шаблонов, которых нет на английском, и наоборот, и использование этих шаблонов для определения того, что является кодом, а что нет, путем запуска алгоритма в сообщениях.
(Однако я не уверен, как будет работать такой алгоритм. Другие ответы на текущий вопрос могут иметь для этого полезную информацию.)
Затем система может повторно сканировать код время от времени, чтобы учесть изменения в том, как код смотрит на данный момент времени.
источник