![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
![]() Grupa: Zarejestrowani Postów: 733 Pomógł: 4 Dołączył: 11.11.2009 Ostrzeżenie: (0%) ![]() ![]() |
Witam wszystkich.
Nurtuje mnie pytanie jak sprawdzić przy pomocy php i mysql czy dana praca nie jest plagiatem. Mianowicie. Do bazy danych kilka osób wysyła prace ja je pobieram i akceptuje albo odrzucam i to jest banalne. Ale chodzi mi o fakt, gdy dwie osoby podeślą bardzo podobną pracę. Oczywiście nie muszą być identyczne, ale dużo rzeczy może być identycznych. Zastanawiam się jak to zrobić. Jak porównać aktualnie otwartą pracę z innymi znajdującymi się już w bazie danych. Oczywiście można zapamiętać jak mniej więcej wyglądała jakaś praca i czy się powtarza, ale ja tutaj rozważam przypadek kiedy to prace akceptuje kilka osób i potrzebny jest taki skrypt. PS. Skrypt nie może być bardzo rygorystyczny, ani za mało ![]() Pozdrawiam ![]() -------------------- |
|
|
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 309 Pomógł: 56 Dołączył: 3.11.2006 Skąd: Gliwice Ostrzeżenie: (0%) ![]() ![]() |
Może wstępnie policzyć ilość powtarzających się wyrazów, a jeśli jest podejrzanie duża to ręcznie się za to zabrać i porównać (chyba że to praca na 30 stron).
|
|
|
![]()
Post
#3
|
|
![]() Grupa: Zarejestrowani Postów: 733 Pomógł: 4 Dołączył: 11.11.2009 Ostrzeżenie: (0%) ![]() ![]() |
Z góry przyjmujemy, że praca ma dużo stron
![]() -------------------- |
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 1 495 Pomógł: 245 Dołączył: 1.07.2009 Skąd: Bydgoszcz Ostrzeżenie: (0%) ![]() ![]() |
Myślę, że można by to zrobić tak:
Wczytujesz całe 2 prace do tablic ($tab1 i $tab2). Każde słowo jako oddzielny element. Następnie porównujesz $tab1[0] po kolei z kolejnymi elementami tablicy drugiej, czyli pracy porównywanej. Po natrafieniu na identyczne słowo (np. $tab1[0] == $tab2[345]) porównujesz $tab1[1] z następnym wyrazem w drugiej tablicy czyli $tab2[346]. Jeśli $tab[1] == $tab[346] to sprawdzasz kolejne elementy np. 5 razy, bo ustalamy, że 5 słów pod rząd to już jest plagiat. Czyli $tab1[2] do $tab2[347], potem $tab1[3] do $tab[348] itd. Jeśli natomiast, żaden element z $tab2 nie jest identyczny, lub nie ma 5 kolejnych identycznych przechodzisz do następnego elementu czyli $tab1[1] i proces powtarzasz. Na chłopski rozum powinno działać ale daję głowę, że będzie okrutnie zasobo-żerne, ale skuteczne. Natomiast prościej np. szukając identycznych tylko takich samych zdań to: Wczytujesz 2 prace do 2 stringów. Pierwszy traktujesz explode, dzieląc go wg kropek, lub znaków zapytania, a właściwie wg. obu. Potem szukasz powtórzeń w drugim stringu używając substr_compare lub substr_count . Proces powtarzasz dla każdego elementu tablicy, czyli każdego zdania pierwszej pracy.
Ten post edytował sadistic_son 10.08.2010, 20:52:23 -------------------- Uśpieni przez system, wychowani przez media,
Karmieni zmysłami, próżnymi żądzami... -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- Jesteś zbyt leniwy, żeby się zarejestrować? Ja jestem zbyt leniwy aby Ci pomóc! -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- |
|
|
![]()
Post
#5
|
|
![]() Grupa: Zarejestrowani Postów: 309 Pomógł: 56 Dołączył: 3.11.2006 Skąd: Gliwice Ostrzeżenie: (0%) ![]() ![]() |
Ewentualnie funkcja similar_text.
Nigdy jej nie używałem, więc nie wiem czy działa wedle oczekiwań. |
|
|
![]()
Post
#6
|
|
![]() Grupa: Zarejestrowani Postów: 733 Pomógł: 4 Dołączył: 11.11.2009 Ostrzeżenie: (0%) ![]() ![]() |
Ale ja nie koniecznie będę porównywał dwie prace ale jedną będę przyrównywał na przykład do trzystu prac i co wtedy??
-------------------- |
|
|
![]()
Post
#7
|
|
![]() Grupa: Zarejestrowani Postów: 142 Pomógł: 49 Dołączył: 29.07.2010 Ostrzeżenie: (0%) ![]() ![]() |
Ja bym nie analizował słowo po słowie, tylko zdanie po zdaniu. Pomysł sadistic_son nie wyłapie prostej zmiany szyku:
1. PHP jest jednym z najlepszych języków skryptowych, 2. Spośród języków skryptowych jednym z najlepszych jest PHP. Dlatego ja bym podzielił całą pracę na poszczególne zdania, a potem, w pętli, porównał każde zdanie z pracy A z każdym zdaniem z pracy B nadając poszczególnym "parom zdań" odpowiednią procentową wartość podobieństwa (wyrażoną prostym stosunkiem liczby słów obecnych w obu zdaniach do liczby wszystkich słów w zdaniu). Zdania bardzo podobne, a położone niedaleko od siebie można łączyć we fragmenty - jeżeli znajdzie się pięć kolejnych zdań z wynikiem >60%, to mamy plagiat. żeby wzmocnić ten algorytm to trzeba by było każde słowo sprowadzić do formy podstawowej (przymiotniki i rzeczowniki zamienić na rodzaj męski liczby pojedynczej, a czasowniki do bezokoliczników) oraz zbudować tablicę bezpośrednich synonimów dla poszczególnych słów. Dzięki tym dwóm zabiegom zdania: "Alina ma kota" i "Ala posiada kotka" zostaną ustandaryzowane do postaci: "Alina mieć kot". Cytat Ale ja nie koniecznie będę porównywał dwie prace ale jedną będę przyrównywał na przykład do trzystu prac i co wtedy?? Niczego to nie zmienia - i tak musisz wyjść od zbudowania algorytmu porównującego 2 prace. Ten post edytował skarabe.pl 10.08.2010, 20:40:47 |
|
|
![]()
Post
#8
|
|
![]() Grupa: Zarejestrowani Postów: 1 495 Pomógł: 245 Dołączył: 1.07.2009 Skąd: Bydgoszcz Ostrzeżenie: (0%) ![]() ![]() |
Pomysł sadistic_son nie wyłapie prostej zmiany szyku: Takiej zamiany zdań to nie wyłapie nawet plagiat.pl Wiem bo sam ostatnio 'przerabiałem' pracę w ten sposób i plagiat się nie połapał 1. PHP jest jednym z najlepszych języków skryptowych, 2. Spośród języków skryptowych jednym z najlepszych jest PHP. ![]() Ten post edytował sadistic_son 10.08.2010, 20:55:38 -------------------- Uśpieni przez system, wychowani przez media,
Karmieni zmysłami, próżnymi żądzami... -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- Jesteś zbyt leniwy, żeby się zarejestrować? Ja jestem zbyt leniwy aby Ci pomóc! -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- |
|
|
![]()
Post
#9
|
|
![]() Grupa: Zarejestrowani Postów: 142 Pomógł: 49 Dołączył: 29.07.2010 Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#10
|
|
![]() Grupa: Zarejestrowani Postów: 1 495 Pomógł: 245 Dołączył: 1.07.2009 Skąd: Bydgoszcz Ostrzeżenie: (0%) ![]() ![]() |
żeby wzmocnić ten algorytm to trzeba by było każde słowo sprowadzić do formy podstawowej........ Kolego.... ![]() Ten post edytował sadistic_son 10.08.2010, 21:01:55 -------------------- Uśpieni przez system, wychowani przez media,
Karmieni zmysłami, próżnymi żądzami... -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- Jesteś zbyt leniwy, żeby się zarejestrować? Ja jestem zbyt leniwy aby Ci pomóc! -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- |
|
|
![]()
Post
#11
|
|
![]() Grupa: Zarejestrowani Postów: 142 Pomógł: 49 Dołączył: 29.07.2010 Ostrzeżenie: (0%) ![]() ![]() |
Kolego.... ![]() 400k słów pospolitych (w przybliżeniu) * 16 bajtów (po 8, średnio, na słowo i synonim) = 6,5 MB - czy to dużo? Do tego każda praca/wypracowanie itp. byłyby przechowywane w bazie w dwóch postaciach - oryginalnej i uproszczonej ("ala mieć kot") - żeby przyspieszyć porównywanie. Dla mnie to nie jest aż taka fantastyka. Poza tym - pisałem tylko o teoretycznych możliwościach - autor wątku już sam musi zdecydować, jak wysoka niezawodność algorytmu jest mu potrzebna. |
|
|
![]()
Post
#12
|
|
Grupa: Zarejestrowani Postów: 782 Pomógł: 153 Dołączył: 21.07.2010 Ostrzeżenie: (0%) ![]() ![]() |
@skarabe.pl czy to co proponujesz nie jest czasem jakąś odmianą testu statystycznego nieparametrycznego (testu U mi się narzucił)? Stosowanie statystyki również mogłoby być tutaj dobrym rozwiązaniem (nie wiem czy do PHPa są jakieś natywne implementacje tych testów).
Innym rozwiązaniem które mi krąży po głowie - to użycie naiwnego klasyfikatora bayesowskiego. W wykrywaniu spamu daje radę. Znalazłem nawet fajny art opisujący implementacją w PHPie. Ma tylko tą jedną wadę że na początku trzeba go ręcznie uczyć które prace mają być uznane za spam - zawsze jednak można połączyć testowanie statystyczne z klasyfikatorem. PS: Nie zmienia to faktu że twój algorytm wydaje się najprostszy w implementacji ![]() -------------------- Już mi się ani wiedzieć, ani tym bardziej myśleć nie chce.
[Think different]! |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 12.06.2025 - 10:51 |