Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [klasa JS], Klasa implementująca prosty algorytm słownikowy
everth
post
Post #1





Grupa: Zarejestrowani
Postów: 782
Pomógł: 153
Dołączył: 21.07.2010

Ostrzeżenie: (0%)
-----


Witam, ostatnio pewien post podsunął mi pomysł opracowania wyszukiwania słownikowego. Przy okazji postanowiłem trochę podreperować swój czysty JS. Więc stworzyłem klasę typu słownik która za pomocą bazy słów zgromadzonych wcześniej w pamięci może podpowiadać słowa pasujące do wzorca. Klasa jest prymitywna, nie do końca jestem pewien czy dobrze zaimplementowana - w każdym razie ostatnio jak testowałem to osiągnęła status "nie wiem jak, ale działa". Osobną kwestią pozostaje pytanie o sens stosowania takiego rozwiązania i jego wydajność. Skrypt testowany tylko pod Chrome. Wrzucam i komentujcie (jeśli w ogóle jest co (IMG:style_emoticons/default/winksmiley.jpg) ).

ADD: Próbowałem wdrożyć się w komentowanie za pomocą JSDoca, ale nie wiem czy dobrze zrozumiałem składnię - dla ułatwienia dodałem na górze skryptu opis tych paru metod

[JAVASCRIPT] pobierz, plaintext
  1. // Obiekt Słownik
  2. // .addWords(words) - dodaje słowa do słownika z tablicy;
  3. // .addWord(word) - dodaje pojedyncze słowo
  4. //
  5. // .searchWord(pattern) - zwraca tablicę słów pasujących do dopasowania
  6.  
  7. /**
  8.  * Tworzy obiekt Słownik
  9.  *
  10.  * @constructor
  11.  * @this {Slownik}
  12.  * @param {slownik} przyjmuje sformatowany słownik (np. poprzez ajax)
  13.  */
  14. function Slownik(slownik) {
  15. /** @private */ var dict = (typeof(slownik)!='undefined' && slownik) ? slownik:new Array();
  16.  
  17.  
  18. /**
  19.  * Podmieniam plik słownika (np. na pobrany za pomocą ajaxa
  20.  *
  21.  * @this {Slownik}
  22.  * @param {new_dict} Nowy słownik
  23.  * @return {Slownik} Zwraca referencje do obiektu
  24.  */
  25. this.addDict = function(new_dict) {
  26. dict = new_dict;
  27. return this;
  28. }
  29.  
  30. /**
  31.  * Dodaje słowa do słownika z tablicy
  32.  *
  33.  * @this {Slownik}
  34.  * @param {words} Jednowymiarowa tablica zawierająca słowa
  35.  * @return {Slownik} Zwraca referencje do obiektu
  36.  */
  37.  
  38. this.addWords = function(words) {
  39. ar_length = words.length
  40. for(i in words) {
  41. this.addWord(words[i]);
  42. }
  43. return this;
  44. }
  45.  
  46. /**
  47.  * Dodaje słowo do słownika
  48.  *
  49.  * @this {Slownik}
  50.  * @param {word} Dodawane słowo
  51.  * @return {Slownik} Zwraca referencje do obiektu Slownik
  52.  */
  53. this.addWord = function(word) {
  54. var temp_dict = dict;
  55. w_length = word.length;
  56. for (i=0;i<w_length;i++) {
  57. k = word[i]//.charCodeAt(0).toString() - osobna kwestia to kodowanie znaków, nie udało mi się tego rozwiązać
  58. if (!temp_dict[k]) {
  59. temp_dict[k] = (typeof(word[i+1])=='undefined') ? null:new Array();
  60. }
  61. temp_dict = temp_dict[k];
  62. }
  63. return this;
  64. };
  65.  
  66. /**
  67.  * Wyszukuje słowa pasujące do wzorca
  68.  *
  69.  * @this {Slownik}
  70.  * @param {word} Szukany wzorzec
  71.  * @return {result} Zwraca tablicę słów pasujących do wzorca
  72.  */
  73.  
  74. this.searchWord = function(word) {
  75. ref = getIndex(word);
  76. result= new Array();
  77. getMatches(result,ref,word);
  78. return result;
  79. };
  80.  
  81. function getIndex(word) {
  82. temp_ref = dict;
  83. w_length = word.length;
  84. for (k=0;k<w_length;k++) {
  85. i = word[k]//.charCodeAt(0).toString()
  86. if (temp_ref[i]) {
  87. temp_ref = temp_ref[i];
  88. } else {
  89. return false
  90. }
  91. }
  92. return temp_ref;
  93. };
  94.  
  95. function getMatches(result,ref,prev_word) {
  96. for(key in ref) {
  97. new_word = prev_word+key//String.fromCharCode(key);
  98. if (ref[key]==null) temp_ref = result.push(new_word);
  99. getMatches(result,ref[key],new_word)
  100. }
  101. };
  102. }
  103.  
  104. // Przykładowe połączenie z AJAX (używam jQuery)
  105.  
  106. $(document).ready(function() {
  107. $.get('slownik.php',function(result) {
  108. dictio = new Slownik(result); //tworzę słownik - słowa pobieram za pomocą JSON
  109. res = dictio.searchWord('h'); //zwraca dopasowania do litery h
  110. window.console.debug(res); //wyświetlam w konsoli
  111. },'json')
  112. });
[JAVASCRIPT] pobierz, plaintext

Skrypt do PHP budujący słownik po stronie serwera
  1. class Dictionary {
  2.  
  3. private $dict = array();
  4.  
  5. function __construct($words) {
  6. $this->createDictionary($words);
  7. }
  8.  
  9. function createDictionary($words) {
  10. foreach($words as $word) {
  11.  
  12. $this->addWord($word);
  13. }
  14. }
  15.  
  16. function addWord($word) {
  17. $temp_dict =& $this->dict;
  18. $w_length = strlen($word);
  19. for($i=0;$i<$w_length;$i++) {
  20. $char = $word[$i];
  21. if (!isset($temp_dict[$char])) {
  22. $temp_dict[$char] = (isset($word[$i+1])) ? array():NULL;
  23. }
  24. $temp_dict =& $temp_dict[$char];
  25. }
  26. return $this;
  27. }
  28.  
  29. function getJSON() {
  30. return json_encode($this->dict);
  31. }
  32.  
  33. }
  34.  
  35. // ZASTOSOWANIE
  36.  
  37. $words = array('hihi','hyhy','humhum'); //przykładowe słowa
  38.  
  39. $dict = new Dictionary($words); //tworzę słownik
  40. echo $dict->getJSON(); //pobieram słownik zakodowany w formacie JSON
Go to the top of the page
+Quote Post
wookieb
post
Post #2





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Dlaczego w php wypluwasz CAŁY słownik zamiast po prostu wygenerować w php tylko te słowa, które są potrzebne?
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 16.09.2025 - 12:08