텍스트에서 코드를 안정적으로 감지하는 간단한 방법은 무엇입니까?


142

Gmail에는 첨부 파일이 있다고 생각 되는 전자 메일을 보내려고 할 때 경고하는이 기능이 있습니다 .

파일을 첨부 하시겠습니까?

GMail see the attached은 이메일 에서 문자열 을 감지 했지만 실제 첨부 파일은 없으므로 보내기 단추를 클릭하면 확인 / 취소 대화 상자가 표시됩니다.

Stack Overflow에 관련 문제가 있습니다. 사용자가 게시물에 진입 할 때 즉, 이와 같은이 :

내 문제는 데이터베이스를 변경해야하지만 생성하지는 않는다는 것입니다 
새로운 연결. 예:

DataSet dsMasterInfo = 새로운 DataSet ();
데이터베이스 db = DatabaseFactory.CreateDatabase ( "ConnectionString");
DbCommand dbCommand = db.GetStoredProcCommand ( "uspGetMasterName");

이 사용자는 코드를 코드 로 포맷하지 않았습니다 !

즉, 마크 다운 당 4 칸 들여 쓰기를하지 않았거나 코드 버튼 (또는 키보드 단축키 ctrl+ k)을 사용하지 않았습니다 .

따라서 Google 시스템은 사람들이 들어가야 할 부분을 많이 편집하고 어떻게 든 알아낼 수없는 사람들을 위해 코드를 수동으로 형식화합니다. 이것은 많은 배를 흘리게 합니다. 편집기 도움말을 여러 번 개선했지만 사용자 집으로 이동하여 키보드의 올바른 버튼을 누르지 않으면 다음에 수행 할 작업을 볼 수 없습니다.

이것이 Google Gmail 스타일 경고를 고려하는 이유입니다.

코드를 게시 했습니까?

우리는 코드처럼 보이는 것을 작성했지만 툴바 코드 버튼 또는 ctrl+ k코드 형식 명령을 사용하여 4 개의 공백을 들여 쓰기하여 코드 형식을 지정하지 않았습니다 .

그러나이 경고를 표시하려면 질문에서 형식화되지 않은 코드라고 생각되는 것을 감지 해야합니다 . 이 작업을 수행하는 간단하고 반 신뢰할 수있는 방법은 무엇입니까?

  • 마크 다운 코드는 항상 4 공백으로 또는 역 따옴표 안에 들여, 그래서 올바른 형식 아무것도 즉시 검사에서 폐기 될 수있다.
  • 이는 경고 일 뿐이며 평판이 좋지 않은 사용자에게 첫 번째 질문을하거나 (또는 ​​첫 번째 답변을 제공하는) 경우에만 적용되므로 약 5 % 이하인 한 일부 오 탐지가 좋습니다.
  • 스택 오버플로에 대한 질문은 모든 언어로 가능하지만 "큰 10 개"언어로 검사를 제한 할 수는 있습니다. 태그 페이지 당 C #, Java, PHP, JavaScript, Objective-C, C, C ++, Python, Ruby입니다.
  • 사용 스택 오버플로 가공 데이터 덤프를 잠재적 인 솔루션을 감사 (또는 단지에서 몇 가지 질문 선택 10 태그 스택 오버플로를)하고 수행하는 방법을 참조하십시오.
  • 의사 코드는 괜찮지 만 더 친숙해지고 싶다면 c #을 사용하십시오.
  • 더 간단할수록 좋습니다 (작동하는 한). 키스! 솔루션에서 10 개의 다른 컴파일러에서 게시물을 컴파일하거나 베이지안 추론 엔진을 수동으로 훈련시키기 위해 많은 사람들이 컴파일해야하는 경우, 그것은 우리가 생각했던 것과 정확히 다릅니다.

34
방금 경우 내 생각 항상 더 들여 쓰기가 존재하지 않는 경우 경고를 표시,이 방법으로 5 % 오차 한계 이하가 될 것입니다. 이것은 농담의 절반에 불과합니다.
Konrad Rudolph

59
@Konrad 메시지가 다음과 같은 경우 훨씬 더 효과적 일 것입니다. 이는 모든 경우의 99 %를 차지해야합니다.
thorsten müller 2016 년

3
이것은 좋은 질문이지만 대답이 없다고 생각합니다. 당신은 나에게 바보 증거 시스템을 보여주고 더 나은 바보를 보여줄 것입니다. 이 문제를 CODE로 해결할 수 있다고해도 해결해서는 안될까요? 적절한 질문을하고 적절한 답변을 제공하는 나와 같은 사람들을 위해이 사이트를 망치고있는 적절한 질문을하는 것은 귀찮게 할 수없는 무지한 사람들입니다.
maple_shaft

2
내가 본 일반적인 패턴은 제대로 들여 쓰기 된 코드 블록이지만 첫 번째와 마지막 줄 (일반적으로 두 줄 만, 예를 들어 여러 기능을 표시 할 때 더 많음)이 코드로 표시되지 않은 곳입니다. 이것도 역시 감지되어야합니다.
3Doubloons

3
참고로 Gmail 확인 텍스트는 다소 혼란 스러워요. 첫 번째 질문에 대한 답변이 '예'이면 두 번째 질문에 대한 답변은 '아니요'입니다.
pimvdb

답변:


147

적절한 해결책은 아마도 학습 / 통계 모델 일 것입니다. 그러나 다음은 재미있는 아이디어입니다.

  1. 줄 끝의 세미콜론 . 이것만으로도 많은 언어를 잡을 수 있습니다.
  2. 공백없이 텍스트 바로 뒤에 괄호를 붙여 분리합니다. myFunc()
  3. 두 단어 사이의 점 또는 화살표 : foo.bar = ptr->val
  4. 중괄호의 존재, 괄호 : while (true) { bar[i]; }
  5. "코멘트"구문 (/ *, // 등)의 존재 : /* multi-line comment */
  6. 흔하지 않은 캐릭터 / 오퍼레이터 : +, *, &, &&, |, ||, <, >, ==, !=, >=, <=, >>, <<, ::, __
  7. 텍스트에서 구문 형광펜을 실행하십시오. 그것의 높은 비율을 강조하면 코드 일 것입니다.
  8. 게시물의 camelCase 텍스트입니다.
  9. 중첩 괄호, 중괄호 및 / 또는 괄호.

각각이 나타나는 횟수를 추적 할 수 있으며 이들은 SpamAssassin이하는 방식 인 perceptron 과 같은 기계 학습 알고리즘의 기능으로 사용될 수 있습니다 .


25
팁 : 단어 사이의 점이 오타의 결과 일 수 있으므로 3의 가중치는 매우 낮습니다. 5는 URL과 일치하지 않아야합니다. 6의 경우 앰퍼샌드가 코드 컨텍스트 외부에서 자주 사용되기 때문에이 문자의 가중치도 줄일 수 있습니다. Notepad ++에서 볼 때 코드가 아닌 텍스트를 강조 표시 할 수 있기 때문에 형광펜이 작동하는지 다시 확인하십시오.
Tamara Wijsman 2016 년

8
다시. 오타로서-저자가 어쨌든 편집해야 함을 표시하는 데 아무런 해가 없습니다.
user151019

4
또한, 많은 언어가 도움이 될 수있는 키워드 : WHILE, ELSE, IF, LOOP, BREAK 등
JoséNunoFerreira

6
"숫자가 아닌 단어 앞에 $의 사용법 : $ var은 Perl 및 PHP (및 Ruby?)에서 일반적입니다."
PhiLho

4
내을 감지하지 못합니다 SELECT DISTINCT name FROM people WHERE id IS NOT NULL.
Benoit

54

한쪽의 영어 쓰기와 다른 쪽의 코드의 평균 메트릭이 무엇인지 궁금합니다.

  • 단락 길이
  • 선의 길이
  • 단어의 크기
  • 사용 된 문자
  • 알파벳, 숫자 및 기타 기호 문자의 비율
  • 단어 당 기호 수
  • 기타

어쩌면 그 코드만으로도 코드와 나머지 코드를 구별 할 수있을 것입니다. 적어도 언어에 관계없이 코드는 많은 경우에 눈에 띄게 다른 지표를 보여줄 것이라고 생각합니다.

좋은 소식은 통계를 구축 할 데이터가 이미 많다는 것입니다.


좋아, 나는 가정을 뒷받침하기 위해 데이터로 돌아왔다. :-)

나는 자신의 게시물과 StackOverflow 에서 찾은 첫 번째 게시물 에서 매우 고급 도구 로 빠르고 더러운 테스트를 수행했습니다 wc.

다음은이 wc두 예제의 텍스트 부분과 코드 부분에서 실행 한 후의 내용입니다 .

먼저 영어 부분을 보자 .

  • 게시물의 영어 부분 (2635 자, 468 단어, 32 줄)
    • 5 문자 / 워드, 82 문자 / 라인, 14 워드 / 라인
  • 다른 게시물의 영어 부분 (1499 자, 237 단어, 12 줄)
    • 6 문자 / 단어, 124 문자 / 라인, 19 단어 / 라인

당신도 그렇게 생각하지 않습니까?

이제 코드 부분을 보자!

  • 게시물의 코드 부분 (174 자, 13 단어, 3 줄)
    • 13 문자 / 단어, 58 문자 / 행, 4 단어 / 라인
  • 다른 게시물의 코드 부분 (4181 자, 287 워드, 151 줄)
    • 14 자 / ​​단어, 27 자 / ​​라인, 2 단어 / 라인

이러한 측정 항목이 얼마나 다른지, 더 중요한 것은 영어 측정 항목과 어떻게 다른가? 그리고 이것은 제한된 도구를 사용하고 있습니다. 더 많은 메트릭을 측정하여 실제로 정확한 것을 얻을 수 있다고 확신합니다 (특히 문자 통계에 대해 생각합니다).

나는 쿠키를 할 수 있습니까?


6
줄 길이, 특히 글 머리 기호를 제외하고 특정 구두점을 포함하는 특정 길이보다 작은 군집 줄을 찾는 경우 좋은 방법으로 보입니다.
Jon Hopkins

이것은 코드 블록에서 작동하지만 인라인 cdde를 찾는 것이 훨씬 어려워 보입니다. 그래도 얼마나 중요한지 잘 모르겠습니다. 더 큰 문제는 포맷되지 않은 코드의 큰 블록입니다.
cHao

3
쿠키 없음. 게시물의 링크는 404입니다
james.garriss

@ james.garriss : 인터넷이 쿠키 항아리를 훔쳤습니다. :( 그래도 고맙습니다.
Julien Guertault

23

일반적으로 Markov 체인은 텍스트를 생성하는 데 사용되지만 훈련 된 모델 과 텍스트의 유사성을 예측하는 데에도 사용할 수 있습니다 ( CE Shannon 1950에 따라 ). 여러 Markov 체인을 권장합니다.

널리 사용되는 각 언어에 대해 언어의 대표 코드 샘플에서 Markov 체인을 학습하십시오. 그런 다음 코드를 감지하려는 스택 오버 플로우 게시물의 경우 각 체인에 대해 다음을 수행하십시오.

  • 게시물의 선을 반복합니다.
    • 두 개의 변수를 선언하십시오 : ACTUAL = 1.0 및 HIGHEST = 1.0
    • 줄의 각 문자를 반복합니다.
      • 각 문자에 대해 Markov 체인에서 현재 문자가 이전 N 문자 뒤에 오는 확률을 찾으십시오. ACTUAL = ACTUAL * PROB 1로 설정하십시오 . 현재 문자가 체인에 없으면 0.000001과 같이 PROB 1에 작은 값을 사용하십시오 .
      • 이제 이전 N 개의 문자를 따를 가능성이 가장 높은 문자 (즉, 가장 높은 확률)를 찾으십시오. HIGHEST = HIGHEST * PROB 2로 설정하십시오 .
      • 분명히, PROB 2 > = PROB 1

각 줄마다 ACTUAL 및 HIGHEST 값이 있어야합니다. 실제를 최고로 나눕니다. 특정 라인이 소스 코드인지에 대한 적합성 점수를 제공합니다. 그것은 당신이 준 예제에서 각 줄과 숫자를 연결시킵니다 :

my problem is I need to change the database but I don't won't to create // 0.0032
a new connection. example: // 0.0023

DataSet dsMasterInfo = new DataSet(); // 0.04
Database db = DatabaseFactory.CreateDatabase("ConnectionString");   // 0.05
DbCommand dbCommand = db.GetStoredProcCommand("uspGetMasterName");  // 0.04

마지막으로 게시물에 코드가있는 시점을 결정하기 위해 임계 값을 선택해야합니다. 이것은 단순히 고성능을 산출하는 관찰에 의해 선택된 숫자 일 수 있습니다. 또한 점수가 높은 줄 수를 고려할 수도 있습니다.

훈련

훈련하려면 언어로 된 대표적인 대표적인 코드 샘플을 확보하십시오. 코드 텍스트를 반복하고 파일의 각 N- 그램 (N 범위는 매개 변수화되어야 함)을 후속 문자의 통계 빈도와 연관시키는 프로그램을 작성하십시오. 그러면 bigram 다음에 각각 가능성과 연관된 여러 가능한 상태의 문자가 생성됩니다. 예를 들어, bigram "()"은 다음과 같은 문자 가능성을 가질 수 있습니다.

"()" 0.5-> ";"
"()" 0.2-> "."
"()" 0.3-> "{"

첫 번째는 "세미콜론이 빈 괄호 뒤에 올 확률은 0.5입니다"와 같이 읽어야합니다.

훈련을 위해, 나는 2-5의 N- 그램을 권장합니다. 내가 이것에 대한 약간의 연구를 할 때 , 우리는 2에서 5까지의 N-grams가 영어에 잘 작용한다는 것을 알았습니다. 많은 소스 코드가 영어와 비슷하기 때문에 해당 범위로 시작한 다음 작동하는 것을 찾을 때 최적의 매개 변수 값을 찾도록 조정하는 것이 좋습니다.

경고 : 모델은 식별자, 메서드 이름, 공백 등의 영향을받습니다. 그러나 훈련 샘플의 특정 기능을 생략하도록 훈련을 조정할 수 있습니다. 예를 들어 불필요한 공백을 모두 축소 할 수 있습니다. 입력에 공백이 있는지 (스택 오버플로 포스트) 무시해도됩니다. 또한 알파벳 순서를 무시할 수 있는데, 이는 다양한 식별자 명명 규칙에 따라보다 탄력적입니다.

연구 기간 동안 , 우리의 방법은 영어뿐만 아니라 스페인어에도 효과적이었습니다. 왜 이것이 소스 코드에서도 잘 작동하지 않는지 알 수 없습니다. 소스 코드는 인간의 언어보다 훨씬 체계적이고 예측 가능합니다.


2
내가 예측하는 유일한 문제는 확률이 장난감 예제보다 훨씬 작다는 것입니다. 수치 적 불안정성을 감안하면 곧 모든 확률이 0임을 의미합니다. 로그 확률을 사용하면 문제가 해결됩니다. 또한 더 큰 토큰을 사용합니다 (예 : 문자가 아니라 단어 / 문장 부호).
Konrad Rudolph

2
@ Konrad : 여기서의 아이디어는 절대 확률을 테스트하는 것이 아니라 상대 확률을 테스트하는 것입니다. 각 줄에 대해 해당 줄의 텍스트는 영어 모델 또는 코드 언어 모델에 의해 생성되었을 가능성이 높습니다.
Ken Bloom

5
기존 SO 게시물에서이 모델을 교육 할 수 있습니다 (특히 Markdown 구문을 설명해야 할 수 있기 때문에). 대부분의 게시물이 올바르게 형식화되었다고 가정하거나 올바르게 형식화되지 않은 게시물을 제거하기 위해 수만 개의 많은 게시물을 선택하는 경우 코드 형식이 아닌 항목은 영어 텍스트라고 가정합니다. 코드 형식의 항목은 코드이므로 실제 SO 답변에서 학습 할 수 있습니다.
Ken Bloom

1
이 작업을 수행하는 방법에 대한 자습서 (Java에서 LingPipe 사용)는 LingPipe의 웹 사이트에서 제공 됩니다. 학습서의 끝에이 문제를 해결하는 기술에 대한 많은 논문이 있습니다. 나는 그들을 읽는 것이 좋습니다.
Ken Bloom

1
최신 솔루션의 투표 수는 매우 적으며, 인정할 수는 있지만 특별 사례에 많이 의존하고 본질적으로 많은 애드혹 솔루션보다 훨씬 적은 비율로 평가됩니다. 과적 합하기 쉽다.
Konrad Rudolph

13

근본적으로 다른 접근법을 제안해도 될까요? SO에서 유일하게 허용되는 언어는 영어이므로 영어 이외의 언어는 99.9 %의 확률로 코드 스 니펫이 될 수 있습니다 .

그래서 내 솔루션은 다음과 같습니다 거기 밖으로 많은 영어 - 체커 중 하나를 사용 (이중 점, 또는 같은 비 언어 기호와 같은 구문 실수 - - 오자 옆에 단지 그들은 또한 신호 확인 #또는 ~). 그런 다음 많은 양의 오류와 경고가 발생하는 행 / 단락은 "이 코드입니까?" 질문.

이 방법은 영어 이외의 다른 언어를 사용하는 StackExchange 사이트에도 적용 할 수 있습니다.

그냥 내 2 ¢ ...


16
문제는 들어오는 질문 중 많은 부분이 영어가 아니라는 것입니다.
Brendan Long

3
@Brendan-이 제안의 이점을 추가 한 다음 게시물의 영어 부분에서 실수에 밑줄을 긋거나 작가가 영어로 글을 쓰도록 도와주세요! ;)
mac

1
나는 네덜란드 사람이며 코드로 작성한 모든 내용은 주석으로 표시되지 않습니다 (프로젝트에 따라 다름). 따라서 영어 이외의 코드는 충분하지 않아야합니다. 또는 깨진 영어는 코드 여야 함을 의미합니다.
Ivo Limmen 2016 년

@Ivo-내 의견은 농담으로 깨진 영어 문제로 해결되었습니다! ;) 그러나 다른 언어로 된 제안서 주석이 제대로 작동한다고 말할 것입니다 ... 영어로 된 OTOH 블록 주석은 "이 코드입니까?" 질문, 그러나 주석이 작성된 코드가 이미 그것을 트리거했기 때문에 괜찮습니다 ...
mac

11

아마 이것에 대한 몇 가지 투표를받을 것입니다. 그러나 당신이 잘못된 각도에서 이것에 접근하고 있다고 생각합니다.

이 줄은 나를 얻었다 :

사람들은 어떻게 든 알아낼 수없는 사람들을 위해 수동으로 코드를 입력해야합니다.

견해는 IMO가 거만합니다. 프로그래머가 아닌 디자이너가 소프트웨어를 올바르게 사용하는 방법을 알 수없는 사용자, 문제가 사용자가 아닌 소프트웨어 자체 또는 UI 인 경우 짜증나게하는 소프트웨어 디자인에서이 점을 많이 발견했습니다.

이 문제의 근본 원인은 사용자가 아니라 그들이 할 수 있다는 것이 분명하지 않다는 사실입니다.

UI를보다 명확하게하기 위해 변경 한 것은 어떻습니까? 확실히 이것은 다음과 같습니다

  1. 새로운 사용자가해야 할 일을 정확히 알 수 있습니다.
  2. 복잡한 알고리즘을 작성하지 않고 여러 언어의 코드 로직을 감지하는 것보다 쉽게 ​​빌드 할 수 있습니다.

예:

여기에 이미지 설명을 입력하십시오


26
실제로이 IMO는 "문제가 있습니다. 코드가 아래에 있습니다."와 같은 잘못된 질문을 시행합니다. 코드와 질문을 분리 할 필요는 거의 없습니다. 가장 좋은 질문은 "이것을 달성하고이 두 줄의 코드를 작성하고 싶지만 그 효과는 다음과 같습니다. 문제는 무엇입니까?"라는 것이 있습니다. 평범한 언어에 많은 코드가 삽입되어 있습니다.
sharptooth

4
근본 관찰은 정확하지만 진단은 여전히 ​​틀립니다. 실제로 Jeff 이 접근 방식을 통해 사용자 인터페이스를 개선하려고합니다. 또한 현재 UI는 이미 여러주기를 거쳤으며 (대폭적으로) 향상 될지 의심하지 않지만 게으른 바보에 도움이 될 것입니다. 제안 된 솔루션도 아닙니다. @sharptooth가 이것을 다룹니다.
Konrad Rudolph

2
나는 상자를 생각하기 위해 +1을 할 것이지만 "지원 코드"를 게시하면 부 자연스러운 질문 흐름이 발생하기 때문에 구체적인 제안에 동의하지 않습니다. 내 질문의 맨 아래에 코드를 넣지 않았습니다. 나는 거의 항상 인트로, 샘플 코드, 실제 질문을 게시합니다. 인라인 코드가 필수적이라는 전제를 받아들이면, 사용자가 입력하거나 시스템에서 권장하는 형식의 형식이 필요합니다. 그리고 그것은 Jeff가 요구하는 정확한 것입니다.
Nicole

1
@ Konrad : 위의 의견과 귀하의 의견에 따라 Jeff 가이 경로를 사용하여 UI를 개선한다고 생각하지는 않지만 근본적인 문제의 증상을 치료합니다. 실수를 할 수 없도록 UI가 개선 된 경우 사용자에게 경고하는 솔루션이 필요하지 않습니다. 나는 나의 모범이 최종 해결책이라는 착각이 없다. 그러나 어떤 생각은 "우리는 이것을 최선의 방법으로 제시하고 있는가?"라는 질문에 들어가야한다.
matt_asbury

1
간단한 문장 은 텍스트 상자 주위의 버튼을 사용하여 코드를 표시하십시오{} .
Paŭlo Ebermann 2016

11

의사 코드는 모든 프로그래밍 언어가 '[]', ';', '()'등과 같은 특수 문자에 의존하기 때문에 어려운 문제가 될 수 있습니다. 이러한 특수 문자의 발생 횟수 만 계산하면됩니다. 이진 파일을 감지하는 것처럼 (샘플의 5 % 이상이 바이트 값 0을 포함 함)


나는 [] ()와 같은 특수 문자 그룹을 갖는 것만 큼 이것을 향상시킬 것이다. {} =. 이러한 그룹 중 2-3 개 이상이 포함 된 각 줄은 코드 줄입니다.
혼자

... 또한 가장 일반적인 언어로 공통 문자열을 찾습니다 (예 : "= someword ();"). 대부분의 중괄호 언어의 경우 "<something>"및 "<ab : cde>"와 같은 XML 유사 구문 및 다른 언어의 다른 일반 문자열 구현할 새 언어를 찾을 때 확장 할 수 있으므로 일반적인 구문의 일종의 조회 테이블이 좋은 솔루션이라고 생각합니다.
Arve Systad

의사 코드를 삭제해야 할 것입니다. 어떤 사람들은이 언어를 C 스타일 언어로 쓰는 것을 좋아하지만 다른 사람들은 VB6에 더 가깝게 보이는 평범한 영어를 사용할 것입니다
James P.

4

나는 당신이 특정 언어에 대해서만 이것을 목표로 삼을 필요가 있다고 생각합니다. 일반적으로 영어와 매우 유사한 언어를 얻을 수 있기 때문에이 문제는 다루기 어려울 것입니다 (예 : inform7 ). 운 좋게도 가장 많이 사용 된 것들을 상당히 쉽게 다룰 수있었습니다.

첫 번째 컷은 "; \ n"시퀀스를 찾아서 C, C ++, Java, C # 및 유사한 구문을 사용하고 실제로 간단한 다른 언어와 잘 일치하는 것입니다. 또한 영어보다 영어로 사용될 가능성이 적습니다. 개행없이


플러스 아마도 중괄호의 풍부; p
Marc Gravell

1
Jeff가 자신의 직책에서 말한 것처럼 아마도 주요 언어만을 대상으로 할 것입니다. 그리고 어쨌든, 나는이 기능이 의도 된 새로운 사용자가 INTERCAL ;-)보다 C #이나 자바 스크립트를 게시 할 가능성이 더 높다고 생각합니다.
Ben

예. 그러나 프로그래밍 언어 BRAINFUCK 또는 BLANK에서는 작동하지 않습니다. ;-)
Ivo Limmen

4

누군가가 태그를보고 그 구문을 찾고 있다고 언급했지만 새로운 사용자를 대상으로하기 때문에 격추되었습니다.

더 나은 해결책은 질문 본문에서 언어 이름을 찾은 다음 동일한 전략을 적용하는 것입니다. "자바 스크립트", "자바"또는 "C #"에 대해 언급하면 ​​질문에 대한 가능성 일 가능성이 높으며 질문의 코드가 해당 언어로되어있을 가능성이 있습니다.


특히 제목이 "vb c # .net dot net help me help me !!!"와 같은 경우
NickAldwin

1

먼저 맞춤법 검사를 통해 실행하면 적절한 영어 단어가 거의 없지만 맞춤법 검사기가 나눌 것을 제안하는 단어가 많이 있어야합니다.

그런 다음 일반 영어에서는 일반적이지 않은 문장 부호 / 특수 문자가 있으며 코드에서는 일반적입니다.

  • something(); 평범한 영어 일 수는 없습니다.
  • $something여기서 something모든 숫자는 아닙니다.
  • -> 공백이없는 단어 사이;
  • . 공백이없는 단어들 사이;

물론 제대로 작동하게하려면 이러한 특성을 바탕으로 베이지안 분류기를 구축해야 할 수 있습니다.


1
()를 포함하는 들여 쓰기되지 않은 행을 감지합니다. 메시지를 제안하는 좋은 이유입니다.

코드를 붙여 넣기 전에 어떤 맞춤법 검사기가 질식하지 않습니까?
Tim Post

영어가 모국어가 아닌 사람들이 쓴 일부 메시지와 함께, 맞춤법 검사기는 다른 모든 단어를 질식시킬 것입니다.
PhiLho

@Ph :이 질문 / 답변은 SO에서 받아 들여지지 않습니다.
vartec

1

유사한 구문을 공유하는 여러 언어 세트가 있습니다. 대부분의 언어는 몇 가지 언어의 영향을 받았으므로 [AMPL, AWK, csh, C ++, C--, C #, Objective-C, BitC, D, Go, Java, JavaScript, Limbo, LPC, Perl, PHP, Pike, Processing [은 모두 C의 영향을 받았으므로 C를 감지하면 이러한 모든 언어를 감지 할 수 있습니다. 따라서이 언어 세트를 감지하기위한 간단한 패턴 만 작성하면됩니다.

또한 대부분의 코드는 두 줄 바꿈으로 나뉘거나 게시물의 다른 텍스트 블록과 비슷하기 때문에 텍스트를 블록으로 나눕니다.

이것은 자바 스크립트 (c 제품군에 대한 초 단순 불완전한 샘플)로 쉽게 수행 할 수 있습니다.

var txt = "my problem is I need to change the database but I don't won't to create a new connection. example:\n\nDataSet dsMasterInfo = new DataSet();Database db = DatabaseFactory.CreateDatabase(&quot;ConnectionString&quot;);DbCommand dbCommand = db.GetStoredProcCommand(&quot;uspGetMasterName&quot;);";
var blocks = txt.split(/\n\n/gi); console.dir(blocks);
var i = blocks.length;
var cReg = /if\s*\(.+?\)|.*(?:int|char|string|short|long).*?=.+|while\s*\(.+?\)/gi;

while ( i-- ){
   var current = blocks[i];
   if ( cReg.test( current ) ){
      console.log("found code in block[" +  i + "]");
   }
}

0

각 줄의 단어 / 구두 문자를 세어보세요. 영어는 4보다 많고 코드는 2보다 작습니다.

위의 단락에는 예를 들어 18 개의 단어와 4 개의 문장 부호가 있습니다. 이 단락에는 19 개의 단어와 4 개의 문장 부호가 있으므로 예상 범위 내에 있습니다.

물론 이것은 초보자가 아닌 영어 구사자 질문에 대해 테스트해야하며,이 경우 통계가 왜곡 될 수 있습니다.

[비 공백]. [공백 또는 줄 바꿈]은 코드에서 매우 드물지만 영어에서는 일반적이므로 문장 부호가 아닌 단어로 계산 될 수 있습니다.

가장 큰 문제는 누군가가 다음과 같은 질문을하는 인라인 코드 일 것이라고 생각합니다.

내가 (i = 0; i> 100; i ++) {}라고 말하면 무슨 의미입니까?

그것은 코드와 영어이며 백 틱으로 표시해야합니다.

내가 for (i=0; i>100; i++) {}무슨 말을합니까?


0

먼저 실제로 지정 해야하는 (충분히) 형식화 된 코드와 수동 형식화가 필요한 (너무) 형식이 잘못된 코드를 구별해야한다고 생각합니다.

형식이 지정된 코드에는 줄 바꿈과 들여 쓰기가 있습니다. 즉, 줄 앞에 단일 브레이크 라인이 있으면 좋은 후보입니다. 그 앞에 공백이 있으면 매우 좋은 후보입니다.

일반 텍스트는 두 개의 구분선 또는 두 개의 공백과 서식 지정을위한 구분선을 사용하므로 구별에 대한 명확한 기준이 있습니다.

LISP 코드에서는 세미콜론을 찾지 못하고, 루비 코드에서는 괄호를 찾지 못할 수도 있고, 의사 코드에서는 많이 찾지 못할 수도 있습니다. 그러나 어떤 비 (비 비전) 언어에서도 브레이크 라인과 들여 쓰기로 형식이 지정된 알맞은 코드를 찾을 수 있습니다. 그만큼 보편적 인 것은 없습니다. 최종 코드는 사람이 읽을 수 있도록 작성 되었기 때문입니다.

먼저 잠재적 코드 을 검색하십시오 . 또한 코드 줄은 대개 그룹으로 제공됩니다. 하나가 있다면 위 또는 아래가 코드 줄 일 가능성이 큽니다.

잠재적 인 코드 줄을 골라 내면 수량화 가능한 기준과 비교하여이를 확인하고 몇 가지 임계 값을 선택할 수 있습니다 .

  • 비 단어 문자의 빈도
  • 식별자의 빈도 : CamelCase 또는 under_score 스타일의 매우 짧은 단어 또는 매우 긴 단어
  • 흔하지 않은 단어의 반복

또한 이제 프로그래머와 cs가 있으므로 stackoverflow의 범위가 명확하게 좁혀졌습니다. 모든 언어 태그를 언어로 표시하는 것을 고려할 수 있습니다. 게시 할 때는 언어 태그를 하나 이상 선택 language-agnostic하거나 태그를 선택 하거나 명시 적으로 생략해야합니다.

첫 번째 경우, 어떤 언어를 찾아야하는지, 두 번째 경우에는 의사 코드를 찾고 싶을 수 있습니다. 마지막 경우에는 일부 기술이나 프레임 워크 등.


0

탐지하려는 각 언어에 대한 파서를 생성 한 다음 (ANTLR에 대한 언어 정의를 쉽게 찾을 수 있음) 각 파서를 통해 질문의 각 줄을 실행할 수 있습니다. 줄이 올바르게 구문 분석되면 코드가있을 수 있습니다.

이것에 대한 문제는 일부 영어 (자연어) 문장이 코드로 구문 분석 될 수 있으므로 다른 아이디어도 포함시키고 싶거나 하나 이상의 연속 행이 올바르게 구문 분석되는 경우에만 긍정적 인 결과를 제한 할 수 있다는 것입니다 같은 언어 파서.

다른 잠재적 인 문제는 이것이 의사 코드를 선택하지는 않지만 괜찮을 수도 있다는 것입니다.


사람들은 종종 코드에 구문 오류가 있으며 이에 대해 묻습니다.
Paŭlo Ebermann 2016

0

다른 언어 (현재 가장 많이 사용되는 프로그래밍 언어와 다소 다르게 보임)가 더 대중화되고 현재 사용되는 언어가 덜 대중화됨에 따라 가장 미래에 대비할 수 있고 장기적으로 최소 수동 조정이 필요한 것은 무엇입니까? 무엇을 같은 구글 않습니다 번역 대신 AB와 (), 등과 같은 어떤 일을 찾고의 ( "작동합니까 어떻게?"라는 제목의 단락을 참조)

다시 말해, 코드에서 찾은 패턴을 수동으로 생각하는 대신 컴퓨터가 스스로 알아낼 수 있습니다 . 이것은 할 수 있습니다

  1. 다양한 프로그래밍 언어로 된 많은 코드

    • 제안 : Google 코드 또는 Github와 같은 웹 기반 소스 코드 저장소 또는 이미 코드로 표시된 Stackoverflow의 코드 샘플을 자동으로 가져옵니다.

    • 참고 : 코드 주석을 파싱하는 것이 좋습니다.

  2. 웹 기사에서 가져온 많은 영어 텍스트

    • 프로그래밍에 관한 기사는 아니지만 (그렇지 않으면 코드가 있고 시스템을 혼합 할 수 있습니다 :-))

어떤 종류의 알고리즘 을 사용하면 영어로되어 있지 않은 코드의 패턴을 자동으로 찾거나 그 반대의 경우도 있고, 그 패턴을 사용하여 게시물에서 알고리즘을 실행하여 코드와 코드가 아닌 것을 감지합니다.

(그러나 알고리즘이 어떻게 작동하는지 잘 모르겠습니다. 현재 질문에 대한 다른 답변에는 유용한 정보가있을 수 있습니다.)

그런 다음 시스템은 코드가 특정 시점을 바라 보는 방식의 변화를 설명하기 위해 가끔씩 코드를 다시 스캔 할 수 있습니다.

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