Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Korekta ortograficzna
Forum PHP.pl > Forum > Gotowe rozwiązania > Algorytmy, klasy, funkcje
Speedy
Hej.

Napisałem niedawno klasę do sprawdzania, czy ktoś nie strzela byków w swoim tekście.
Mam cichą nadzieję, że przyczynię się tym do podwyższenia poziomu treści pisanych w naszym pięknym języku, a zwłaszcza w internecie. Wszak nie każdy ma Firefoxa z korektą pisowni winksmiley.jpg.
Klasa korzysta ze słownika ortograficznego PWN dostępnego w internecie na http://so.pwn.pl/, dlatego może być dość powolna przy sprawdzaniu bardzo długich tekstów. Natomiast z tymi krótszymi poradzi sobie szybciej winksmiley.jpg.

Kod klasy:

  1. <?php
  2.  
  3. /**
  4.  * Klasa służąca do korekty ortograficznej
  5.  * korzystająca z internetowego słownika ortograficznego PWN (http://so.pwn.pl/)
  6.  */
  7. class korektaOrtograficzna
  8. {
  9.  
  10. /**
  11.  * tekst do sprawdzenia
  12.  */
  13. private $text;
  14.  
  15. /**
  16.  * tablica z wyrazami posiadającymi błędy ortograficzne
  17.  */
  18.  public $mistakeArray = array();
  19.  
  20. /**
  21.  * sprawdzony tekst z zaznaczonymi błędami
  22.  */
  23. public $markedText;
  24.  
  25. /**
  26.  * konstruktor
  27.  * uruchamia odpowiednie metody
  28.  * @param string text tekst do korekty
  29.  * @return void
  30.  */
  31. public function __construct($text)
  32. {
  33. $this->text = $text;
  34. $this->checkText();
  35. }
  36.  
  37. /**
  38.  * łączy się ze słownikiem ortograficznym PWN
  39.  * i sprawdza czy wyraz jest poprawny
  40.  * @param string $word
  41.  * @return bool
  42.  */ 
  43. private function isCorrectWord($word)
  44. {
  45. $content = file_get_contents('http://so.pwn.pl/lista.php?co='.$word);
  46. return (bool)!strstr($content,'Nie znaleziono haseł spełniających podany warunek.');
  47. }
  48.  
  49. /**
  50.  * przetwarza podany tekst na tablicę z wyrazami,
  51.  * usuwa ewentualne znaki interpunkcyjne i znaczniki HTML
  52.  * @param void
  53.  * @return array
  54.  */
  55. private function text2array()
  56. {
  57. $this->text = htmlspecialchars($this->text);
  58. return (array)explode(' ',preg_replace('/[.,?!]/','',$this->text));
  59. }
  60.  
  61. /**
  62.  * dokonuje korekty podanego tekstu,
  63.  * przekazuje niepoprawne wyrazy do tablicy z błędami
  64.  * oraz wyróżnia niepoprawne wyrazy
  65.  * i przekazuje zmodyfikowany tekst do odpowiedniej zmiennej
  66.  * @param void
  67.  * @return void
  68.  */
  69. private function checkText()
  70. {
  71. $textArray = $this->text2array();
  72. $mistakeArrayMarked = array();
  73.  
  74. foreach($textArray as $word)
  75. {
  76. if(!$this->isCorrectWord($word))
  77. {
  78. $this->mistakeArray[] = $word;
  79. $mistakeArrayMarked[] = '<span style="color:red; font-weight:bold;">'.$word.'</span>';
  80. }
  81. }
  82.  
  83. $this->markedText = str_replace($this->mistakeArray,$mistakeArrayMarked,$this->text);
  84. }
  85.  
  86. }
  87.  
  88. ?>


Przykład użycia:

  1. <?php
  2.  
  3. $tekstDoSprawdzenia = 'Szedł Jasió przes las i zgubił czerfony pas.';
  4.  
  5. $objKorektaOrtograficzna = new korektaOrtograficzna($tekstDoSprawdzenia);
  6.  
  7. echo $objKorektaOrtograficzna->markedText; // sprawdzony tekst z wyróżnionymi błędami
  8.  
  9. echo '<br/>';
  10.  
  11. echo 'Liczba znalezionych błędów: '.count($objKorektaOrtograficzna->mistakeArray);
  12.  
  13. echo '<br/>Błędy:<br/>';
  14.  
  15. print_r($objKorektaOrtograficzna->mistakeArray); // wyświetlenie tablicy ze znalezionymi błędami
  16.  
  17. ?>
Cosi*
Ciekawy pomysł z wykorzystaniem słownika PWN-u. Ostatnio miałem podobny problem i użyłem słownika "kurnikowego", który jest standardowo dołączany do ispella w Linuksie (ale można go też ściągnąć osobno). Wtedy masz słownik "na miejscu" i szybciej, ale waży toto 41 mega, więc bez odchudzenia się nie obejdzie.
Speedy
Ostatnio natrafiłem na coś fajnego o podobnym działaniu, co moja klasa, tylko że via AJAX & JS: http://orangoo.com/labs/GoogieSpell/ .
Wiadomo, że korzystanie ze specjalnie przygotowanych API zawsze będzie szybsze od aplikacji korzystających z zasobów internetu "na żywca", dlatego informacja o tym projekcie może się komuś przydać winksmiley.jpg.
Kocurro
Proponowałbym dołożyć jeszcze cache'owanie wyników.
Fixer
ja użyłem do tego własną bazę zaimportowaną do MySQL'a gdzięki temu można dodawać własne słowa...
w bazie 3 820 062 słów, razem 104 MB

Tu macie rezultat
http://www.ortografik.rox.pl/

Teraz zostało mi tylko użyc ajaxa smile.gif
a potem jakieś komponenty porobić by można było tego użyć np na własnej stronie...
Moli
Dałem
Cytat
idem sobiem polnom drogom

A znalazło mi tylko 2 błedy (sobiem i polnom) smile.gif
Fixer
haa no zgadza sie a to dlatego że słownik będzie miał mozliwość sprawdzania w różnych językach a nawet dialektach jak np gwara śląska a na razie wszystkie słowa są wpierniczone do jednego wora żeby sprawdzić wydajność bazy zeby ją dostosować...

PS bazę słów możesz sobie zrobić samemu ze slownika alernatywnego http://www.kurnik.pl/slownik/growy/
mozesz tam jeszcze dokleić nazwy miast, slowa techniczne, odmiany słów, imion...
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.