Gmail ma tę funkcję, gdzie będzie ostrzec jeśli spróbujesz wysłać wiadomość e-mail, że myśli mogą mieć zajęcia.
Ponieważ Gmail wykrył ciąg see the attached
w wiadomości e-mail, ale nie ma rzeczywistego załącznika, ostrzega mnie w oknie dialogowym OK / Anuluj po kliknięciu przycisku Wyślij.
Mamy podobny problem z przepełnieniem stosu. To znaczy, gdy użytkownik wprowadza post podobny do tego :
mój problem polega na tym, że muszę zmienić bazę danych, ale nie chcę jej tworzyć nowe połączenie. przykład: DataSet dsMasterInfo = new DataSet (); Baza danych db = DatabaseFactory.CreateDatabase („ConnectionString”); DbCommand dbCommand = db.GetStoredProcCommand („uspGetMasterName”);
Ten użytkownik nie sformatował swojego kodu jako kodu!
Oznacza to, że nie wcięli się o 4 spacje na Markdown, ani nie używają przycisku kodu (lub skrótu klawiaturowego ctrl+ k), który robi to za nich.
Dlatego nasz system akceptuje wiele zmian, w których ludzie muszą wejść i ręcznie sformatować kod dla osób, które w jakiś sposób nie są w stanie tego zrozumieć. Prowadzi to do mnóstwa brzucha . Ulepszyliśmy kilka razy pomoc edytora, ale po przejechaniu do domu użytkownika i naciśnięciu odpowiednich przycisków na klawiaturze nie mamy pojęcia, co dalej.
Właśnie dlatego rozważamy ostrzeżenie w stylu Google GMail:
Miałeś na myśli kod pocztowy?
Napisałeś rzeczy, które naszym zdaniem wygląda jak kod, ale nie sformatować go jako kodu przez 4 spacje wcięć za pomocą przycisku paska narzędzi lub kodu ctrl+ kkod polecenia formatowania.
Jednak przedstawienie tego ostrzeżenia wymaga od nas wykrycia w naszym pytaniu pytania, które naszym zdaniem jest niesformatowanym kodem . Jaki jest prosty, częściowo niezawodny sposób na zrobienie tego?
- Według Markdown kod jest zawsze wcięty o 4 spacje lub w backticks, więc wszystko poprawnie sformatowane może zostać natychmiast odrzucone z czeku.
- Jest to tylko ostrzeżenie i będzie miało zastosowanie tylko do użytkowników o niskiej reputacji, którzy zadają pierwsze pytania (lub udzielają pierwszych odpowiedzi), więc niektóre fałszywe trafienia są OK, o ile wynoszą około 5% lub mniej.
- Pytania dotyczące przepełnienia stosu mogą być w dowolnym języku, chociaż możemy realistycznie ograniczyć naszą kontrolę do, powiedzmy, „wielkich dziesięciu” języków. Na stronie tagów, która byłaby C #, Java, PHP, JavaScript, Objective-C, C, C ++, Python, Ruby.
- Skorzystaj ze zrzutu wspólnych danych kreacji Przepełnienie stosu, aby skontrolować potencjalne rozwiązanie (lub po prostu wybierz kilka pytań w 10 najważniejszych tagach Przepełnienie stosu) i sprawdź, jak to działa.
- Pseudokod jest w porządku, ale używamy c #, jeśli chcesz być wyjątkowo przyjazny.
- Im prościej, tym lepiej (o ile działa). POCAŁUNEK! Jeśli twoje rozwiązanie wymaga od nas próby skompilowania postów w 10 różnych kompilatorach lub armii ludzi do ręcznego trenowania bayesowskiego silnika wnioskowania, to ... nie dokładnie to mieliśmy na myśli.
Odpowiedzi:
Właściwe rozwiązanie to prawdopodobnie wyuczony / statystyczny model, ale oto kilka zabawnych pomysłów:
myFunc()
foo.bar = ptr->val
while (true) { bar[i]; }
/* multi-line comment */
+, *, &, &&, |, ||, <, >, ==, !=, >=, <=, >>, <<, ::, __
Można śledzić, ile razy każdy z nich się pojawia, i można ich używać jako funkcji w algorytmie uczenia maszynowego, takiego jak perceptron , tak jak robi to SpamAssassin.
źródło
SELECT DISTINCT name FROM people WHERE id IS NOT NULL
.Byłbym ciekawy, jakie są średnie wskaźniki pisanego angielskiego z jednej strony i kodu z drugiej strony.
Może to samo może odróżnić już kod od reszty. Przynajmniej uważam, że kod, niezależnie od języka, w wielu przypadkach wykazywałby zauważalnie różne wskaźniki.
Dobra wiadomość jest taka: masz już mnóstwo danych, na których możesz budować statystyki.
Ok, wróciłem z pewnymi danymi na poparcie moich założeń. :-)
Zrobiłem szybki i brudny testu na swoim stanowisku i na pierwszym poście znalazłem na StackOverflow , z bardzo zaawansowane narzędzie:
wc
.Oto, co miałem po uruchomieniu
wc
na części tekstowej i części kodowej tych dwóch przykładów:Najpierw spójrzmy na część angielską :
Całkiem podobne, nie sądzisz?
Teraz spójrzmy na część kodu !
Widzisz, jak różne są te wskaźniki, ale co ważniejsze, jak różnią się od wskaźników angielskich? A to tylko przy użyciu ograniczonego narzędzia. Jestem teraz pewien, że możesz uzyskać coś naprawdę dokładnego, mierząc więcej metryk (myślę w szczególności o statystykach znaków).
Mogę Haz Hazle?
źródło
Zazwyczaj łańcuchy Markowa są używane do generowania tekstu, ale mogą być również używane do przewidywania podobieństwa tekstu (zgodnie z CE Shannon 1950 ) do wyuczonego modelu. Polecam wiele łańcuchów Markowa.
Dla każdego rozpowszechnionego języka wytrenuj łańcuch Markowa na dużej, reprezentatywnej próbce kodu w tym języku. Następnie dla postu przepełnienia stosu, dla którego chcesz wykryć kod, wykonaj następujące czynności dla każdego łańcucha:
Dla każdej linii powinieneś mieć wartość RZECZYWISTĄ i NAJWYŻSZĄ. Podziel RZECZYWISTY przez NAJWYŻSZY. To da ci ocenę sprawności, czy dana linia jest kodem źródłowym. To by skojarzyło liczbę z każdą linią w podanym przykładzie:
Na koniec musisz wybrać próg, aby określić, kiedy w kodzie jest kod. Może to być po prostu liczba wybrana przez obserwację, która daje wysoką wydajność. Może również uwzględniać liczbę linii z wysokim wynikiem.
Trening
Aby trenować, zamów dużą reprezentatywną próbkę kodu w języku. Napisz program, który zapętli tekst kodu i powiąże każdy N-gram w pliku (zakres dla N powinien zostać sparametryzowany) z częstotliwością statystyczną następnego znaku. To da wiele możliwych stanów znaków następujących po bigramie, każdy związany z prawdopodobieństwem. Na przykład bigram „()” może mieć następujące prawdopodobieństwo postaci:
Pierwszy należy odczytać, na przykład jako „Prawdopodobieństwo, że średnik podąży za pustym nawiasiem, wynosi 0,5”.
Na trening polecam N-gramów od dwóch do pięciu. Wcześniej, kiedy przeprowadziłem badania na ten temat , stwierdziliśmy, że N-gram w rozmiarach od drugiego do piątego działał dobrze w języku angielskim. Ponieważ znaczna część kodu źródłowego jest podobna do angielskiej, sugerowałbym rozpoczęcie od tego zakresu, a następnie dostosowanie w celu znalezienia optymalnych wartości parametrów w miarę znajdowania, co działa.
Zastrzeżenie: na model będą miały wpływ identyfikatory, nazwy metod, białe znaki itp. Można jednak dostroić trening, aby pominąć niektóre cechy próbki treningowej. Na przykład możesz zwinąć wszystkie niepotrzebne białe znaki. Obecność białych znaków na wejściu (słupek przepełnienia stosu) można również zignorować. Można również zignorować wielkość liter, która byłaby bardziej odporna w obliczu różnych konwencji nazewnictwa identyfikatorów.
Podczas moich badań stwierdziliśmy, że nasze metody sprawdzają się zarówno w języku hiszpańskim, jak i angielskim. Nie rozumiem, dlaczego to również nie działałoby dobrze w przypadku kodu źródłowego. Kod źródłowy jest jeszcze bardziej uporządkowany i przewidywalny niż ludzki język.
źródło
Czy mogę zasugerować zupełnie inne podejście? W SO jedynym dozwolonym językiem ludzkim jest angielski, więc wszystko, co nie jest angielskim, ma 99,9% szans na bycie fragmentem kodu .
Tak więc moim rozwiązaniem byłoby: użyć jednego z wielu sprawdzających język angielski (upewnij się, że sygnalizują one - oprócz błędów pisowni - błędy składniowe, takie jak podwójne kropki, lub symbole niejęzykowe, takie jak
#
lub~
). Następnie każdy wiersz / akapit, który generuje dużą liczbę błędów i ostrzeżeń, powinien wywołać „czy ten kod?” pytanie.To podejście można również dostosować do tych stron StackExchange, które używają innych języków niż angielski.
Just my 2 ¢ ...
źródło
Prawdopodobnie otrzymam za to kilka głosów, ale myślę, że podchodzisz do tego z niewłaściwego punktu widzenia.
Ta linia dała mi:
IMO to stanowisko jest trochę aroganckie. Znajduję to dużo w projektowaniu oprogramowania, w którym programiści i projektanci denerwują się użytkownikami, którzy nie mogą dowiedzieć się, jak prawidłowo korzystać z oprogramowania, gdy problemem nie jest użytkownik, ale samo oprogramowanie - lub przynajmniej interfejs użytkownika.
Podstawową przyczyną tego problemu nie jest użytkownik, ale fakt, że nie jest dla niego oczywiste, że mogą to zrobić.
Co powiesz na zmianę w interfejsie użytkownika, aby uczynić to bardziej oczywistym? Na pewno będzie to:
Przykład:
źródło
{}
przycisku wokół pola tekstowego.Pseudo kod stanowiłby prawdziwe wyzwanie, ponieważ cały język programowania zależy od znaków specjalnych, takich jak „[]”, „;”, „()” itp. Wystarczy policzyć występowanie tych znaków specjalnych. Podobnie jak w przypadku wykrycia pliku binarnego (ponad 5% próbki zawiera wartość bajtu 0).
źródło
Myślę, że być może będziesz musiał skierować to tylko na określone języki, ogólnie problem ten jest prawdopodobnie trudny do rozwiązania, ponieważ możesz uzyskać języki bardzo podobne do angielskiego (np. Inform7 ). ale na szczęście te najczęściej używane można dość łatwo pokryć.
Moim pierwszym cięciem byłoby poszukiwanie sekwencji „; \ n”, która dałaby ci dobre dopasowanie do C, C ++, Java, C # i każdego innego języka, który używa podobnej składni i jest naprawdę prosty. Jest również mniej prawdopodobne, że będzie używany w języku angielskim niż; bez nowej linii
źródło
Ktoś wspomniał, że patrzy na tagi, a następnie szuka do tego składni, ale zostało to zestrzelone, ponieważ jest to skierowane do nowych użytkowników.
Możliwym lepszym rozwiązaniem byłoby poszukiwanie nazw języków w treści pytania, a następnie zastosowanie tej samej strategii. Jeśli wspomnę o „Javascript”, „Java” lub „C #”, prawdopodobnie są o to chodzi w pytaniu, a kod w pytaniu prawdopodobnie będzie w tym języku.
źródło
Najpierw uruchom go przez sprawdzanie pisowni, znajdzie bardzo mało poprawnych angielskich słów, jednak powinno być wiele słów, które sprawdzanie pisowni sugeruje podzielić.
Następnie są znaki interpunkcyjne / specjalne, które nie są typowe dla zwykłego angielskiego, typowe dla kodu:
something();
po prostu nie może być prostym językiem angielskim;$something
gdziesomething
nie wszystkie są liczbami;->
między słowami bez spacji;.
między słowami bez spacji;Oczywiście, aby działał dobrze, możesz chcieć mieć klasyfikator bayesowski zbudowany na tych cechach.
źródło
istnieje kilka zestawów języków o podobnej składni. na kilka języków wpłynęło kilka języków, więc języki [AMPL, AWK, csh, C ++, C--, C #, Objective-C, BitC, D, Go, Java, JavaScript, Limbo, LPC, Perl, PHP, Pike, Processing [były pod wpływem C, więc jeśli wykryjesz C, prawdopodobnie wykryjesz wszystkie te języki. więc musisz tylko napisać prosty wzorzec wykrywania tych zestawów językowych.
podzieliłbym również tekst na bloki, ponieważ większość kodu zostanie podzielona na dwie nowe linie lub podobne z innych bloków tekstu w poście.
można to łatwo zrobić za pomocą javascript (superkompletna niekompletna próbka dla rodziny c):
źródło
Po prostu policz słowa / znaki interpunkcyjne dla każdej linii. Angielski będzie miał zwykle 4 lub więcej, kod mniej niż 2.
Powyższy akapit zawiera na przykład 18 słów i 4 znaki interpunkcyjne. Ten akapit ma 19 słów i 4 znaki interpunkcyjne, więc w granicach oczekiwań.
Oczywiście trzeba by to sprawdzić pod kątem pytań osób słabo znających angielski dla początkujących, i być może w takich przypadkach statystyki są wypaczone.
Oczekuję, że [nie-białe znaki]. [Białe znaki lub nowa linia] jest bardzo rzadkie w kodzie, ale jest powszechne w języku angielskim, więc można to liczyć jako słowa, a nie interpunkcję.
Myślę, że największym problemem będzie kod wewnętrzny, w którym ktoś zadaje takie pytanie:
To jest kod i angielski, i powinny być oznaczone jako tyknięcia:
źródło
Myślę, że najpierw powinieneś dokonać rozróżnienia między (wystarczająco) sformatowanym kodem, który musi być tak naprawdę oznaczony jako taki, a (zbyt) źle sformatowanym kodem, który i tak wymaga ręcznego formatowania.
Sformatowany kod ma linie nieciągłości i wcięcia. To znaczy: jeśli linia jest poprzedzona pojedynczą linią przerwania, masz dobrego kandydata. Jeśli oprócz tego ma wiodące białe znaki, masz bardzo dobrego kandydata.
Normalny tekst używa dwóch linii nieciągłości lub dwóch spacji i linii nieciągłości do formatowania, więc istnieje wyraźne kryterium rozróżnienia.
W kodzie LISP nie znajdziesz średników, w kodzie Ruby możesz nie znaleźć nawiasów, w pseudo-kodzie możesz wcale nie znaleźć wiele. Ale w każdym (nie-ezoterycznym) języku znajdziesz porządny kod do sformatowania za pomocą linii nieciągłości i wcięć. Nie ma nic tak uniwersalnego. Ponieważ w końcowym kodzie jest napisany do odczytu przez ludzi.
Najpierw poszukaj potencjalnych linii kodu . Ponadto wiersze kodu zwykle występują w grupach. Jeśli masz taki, istnieje duża szansa, że ten powyżej lub poniżej jest również wierszem kodu.
Po wyodrębnieniu potencjalnych wierszy kodu możesz je sprawdzić według kryteriów kwantyfikowalnych i wybrać próg :
Ponadto, teraz, gdy są programiści i cs, zakres stackoverflow jest wyraźnie zawężony. Można rozważyć oznaczenie wszystkich znaczników językowych jako języków. Podczas publikowania zostaniesz poproszony o wybranie co najmniej jednego tagu językowego, wybranie
language-agnostic
tagu lub wyraźne pominięcie go.W pierwszym przypadku wiesz, jakich języków szukać, w drugim przypadku możesz poszukać pseudokodu, aw ostatnim przypadku prawdopodobnie nie będzie żadnego kodu, ponieważ jest to pytanie związane z jakąś technologią lub ramy lub takie.
źródło
Możesz utworzyć parser dla każdego języka, który chcesz wykryć (definicje języka dla ANTLR są zwykle łatwe do znalezienia), a następnie uruchomić każdą linię pytania w każdym parserze. Jeśli którykolwiek wiersz jest poprawnie analizowany, prawdopodobnie masz kod.
Problem polega na tym, że niektóre zdania w języku angielskim (w języku naturalnym) mogą być analizowane jako kod, więc możesz chcieć dołączyć także inne pomysły lub możesz ograniczyć pozytywne wyniki tylko wtedy, gdy więcej niż jeden lub dwa kolejne wiersze poprawnie przeanalizują z parser tego samego języka.
Innym potencjalnym problemem jest to, że prawdopodobnie nie odbierze pseudokodu, ale może być OK.
źródło
To, co może być najbardziej przyszłościowe i wymagać będzie najmniejszej ręcznej regulacji na dłuższą metę, ponieważ inne języki (które wyglądają nieco inaczej niż obecnie używane języki programowania) stają się bardziej popularne, a obecnie używane języki stają się mniej popularne, to robić coś w rodzaju tego, co robi Tłumacz Google (patrz akapit zatytułowany „Jak to działa?”) zamiast szukać pewnych rzeczy, takich jak ab i a () itp.
Innymi słowy, zamiast ręcznie wymyślić wzorce znalezione w kodzie, którego można szukać, komputer może sam to zrozumieć . Można to zrobić, mając
dużo kodu w wielu różnych językach programowania
Sugestia: automatycznie pobieraj próbki kodu z internetowych repozytoriów kodu źródłowego, takich jak Google Code lub Github, a nawet z rzeczy w Stackoverflow już oznaczonych jako kod
Uwaga: dobrym pomysłem może być przeanalizowanie komentarzy do kodu
dużo angielskiego tekstu zaczerpniętego z artykułów w Internecie
i posiadanie pewnego rodzaju algorytmu automatycznie znajduje wzorce w kodzie, które nie są w języku angielskim, i odwrotnie, i używając tych wzorców do wykrycia, co jest kodem, a co nie kodem, uruchamiając algorytm na postach.
(Nie jestem jednak pewien, jak taki algorytm działałby. Inne odpowiedzi na bieżące pytanie mogą zawierać przydatne informacje.)
Następnie system może ponownie skanować kod co jakiś czas, aby uwzględnić zmiany w sposobie wyświetlania kodu w tym momencie.
źródło