Robert Rawicz

Robert Rawicz Motorbike mechanic,
The Good Bike Jette
- Brussels SUZUKI...

Temat: dzielenie stringu (zdania) na slowa i zapis slow do tabeli

Witam, potrzebuje podzielic string (zdanie) na poszczegolne slowa i pojedynczo zapisac te slowa w tabeli.
Malo tego , skrypt powinien byc na tyle sprytny ze jezeli w tabeli do ktorej trafiaja pojedyncze slowa takie slowo juz istnieje to nie dodaje go do tabeli tylko zwieksza licznik dla tego slowa o jeden

ktos, cos?
Marek Karmelski

Marek Karmelski PHP Programmer,
Magento dev, Agencja
reklamowa White
Ducky

Temat: dzielenie stringu (zdania) na slowa i zapis slow do tabeli

Dwie rzeczy: PHP: funkcja explode(), SQL: INSERT ... ON DUPLICATE KEY UPDATE. Powinno wystarczyć :).
Janusz Skudrzyk

Janusz Skudrzyk Członek zarządu,
weblabs.pl

Temat: dzielenie stringu (zdania) na slowa i zapis slow do tabeli

Przed explode jeszcze podmiana , . ! ? itp na spacje. W końcu "spacje", "spacje," i "spacje." to tak właściwie jedno i to samo słowo.
No i przy wrzucaniu dobrze jest pominąć puste słowa, które pojawią się przy dwóch i więcej występujących po sobie spacjach. Ew. można zamienić nadmiar spacji na pojedynczą spację, ale wysiłek jest w takim wypadku chyba nawet większy.Ten post został edytowany przez Autora dnia 03.02.16 o godzinie 00:52
Marcin Mackiewicz

Marcin Mackiewicz Programista JAVA, RS
Adware Polska

Temat: dzielenie stringu (zdania) na slowa i zapis slow do tabeli

Proponuję użyć gotowej funkcji do dzielenia na wyrazy
str_word_count("Ala ma  w  kota", 1);
która zwraca tablicę a potem tak jak pisze Marek.
Robert Rawicz

Robert Rawicz Motorbike mechanic,
The Good Bike Jette
- Brussels SUZUKI...

Temat: dzielenie stringu (zdania) na slowa i zapis slow do tabeli

dzieki za wskazowki, docelowo zrobilem cos takiego, idealne nie jest ale dziala:


<?php
// polaczenie z baza danych
require_once "include/connect.php";

// funkcja podmieniajaca niepozadane znaki
function replace($text)
{
$text = str_replace(',', '', $text);
$text = str_replace('.', '', $text);
$text = str_replace('-', '', $text);
$text = str_replace('+', '', $text);
$text = str_replace(';', '', $text);
$text = str_replace(':', '', $text);
$text = str_replace('?', '', $text);
$text = str_replace('!', '', $text);
$text = str_replace('(', ' ', $text);
$text = str_replace(')', ' ', $text);
$text = str_replace('<br>', '\r\n', $text);
$text = strtolower($text);

return $text;
}

// obliczanie ilosci rekordow w tabeli notatnik - wartosc ta potrzebna do licznika petli
$zapytanie ='SELECT * FROM notatnik';
$rezultat = mysql_query($zapytanie) or die (mysql_error());
$ile = mysql_num_rows($rezultat);
for ($start=0; $start<=$ile; $start++) {


$notka='SELECT notka FROM notatnik WHERE id_notka='.$start.'';
$rezultat_notka = mysql_query($notka) or die (mysql_error());
$notka = mysql_fetch_assoc($rezultat_notka);
$notka = $notka['notka']; // aktualizacja tabeli words slowami z pola notka
$string = $notka;
$string = strip_tags($string);
$string = replace($string);
$table = explode(" ", $string);
$count = count($table);
for ($i=0; $i<=$count; $i++) {

$word = $table[$i];
// Sprawdzenie czy w bazie istnieje takie slowo

$sql ="SELECT DISTINCT word FROM words WHERE word = '".$word."'";
mysql_query($sql) or die (mysql_error());

$rezultat = mysql_query($sql) or die (mysql_error());
$row = mysql_fetch_assoc($rezultat);
$slowo = $row['word'];
if($word == $slowo){
$sql ="UPDATE words SET counter = counter + 1 WHERE word = '".$word."'";
mysql_query($sql) or die (mysql_error());

}
else
{ $sql ="INSERT INTO words (word, counter) VALUES ('".$word."', 1)";
mysql_query($sql) or die (mysql_error());
};
};
};
?>
Ten post został edytowany przez Autora dnia 05.02.16 o godzinie 22:45
Marcin Mackiewicz

Marcin Mackiewicz Programista JAVA, RS
Adware Polska

Temat: dzielenie stringu (zdania) na slowa i zapis slow do tabeli

Używaj tagów code aby kod był ładnie cytowany, błagam. Wykonujesz
$string = strip_tags($string);
$string = replace($string);
W funkcji replace zamieniasz tag <br> na \r\n ale ta zamiana nigdy nie nastąpi bo linie wcześniej kasujesz tag <br>.
Dodatkowo nie wiem dlaczego <br> na nową linię. Przykładowo
Teraz mam<br>dla ciebie prezęt
twój kod zamieni na grupy wyrazów
Teraz

mam
dla

ciebie

prezęt
co oznacza, że mam\r\ndla potraktowane zostanie jako jedno słowo bo potem robisz explode po spacji. Tu chyba raczej <br> powinno być zamienione na spację. Całą funkcje "replace" można sprowadzić do jednej linii (preg_replace) oraz dwóch pętelek. Z grubsza bez sprawdzenia wyszło mi coś takiego
// Lista słów do zaktualizowania
$slowa = array();

// Pobierz wszystkie notatki
$result = mysql_query(SELECT notka FROM notatnik) or die();

// Dla każdej notatki
while ($row = mysql_fetch_Assoc($result)) {
// Weź pole "notka"
$notka = $row['notka'];

// Usuń dziwne znaki a tag <br> zamień na spację
$notka = preg_replace(array('/[,.\-\'+;:?!()]/i', '/<br>/'), array('', ' '), $notka);

// Usuń wszytkie zbędne tagi
$notka = strip_tags($notka);

/*
* Tresc podziel na słowa, gdzie separatorem słowa jest spacja
* a następnie dodaj do listy słow jaka ma zostać zaktualizowana w words
*/
$slowa = array_merge($slowa, explode(" ", $notka));
}

/*
* Aktualizuję wszystkie słowa z listy znalezionych słow w tabeli 'words'.
* W przypadku nowego słowa dodaję go do listy a w przypadku istniejącego
* podbijam licznik. SQL-injection pomijam bo preg_replace usuwa ze słowa
* apostrofy.
*/
foreach ($slowa as $slowo) {
$sql = "INSERT INTO words (word, counter) VALUES ('$slowo', 1)
ON DUPLICATE KEY UPDATE counter = counter + 1";
mysql_query($sql);
}
Marcin Mackiewicz

Marcin Mackiewicz Programista JAVA, RS
Adware Polska

Temat: dzielenie stringu (zdania) na slowa i zapis slow do tabeli

Przepraszam za dwa posty.
Z moją propozycją str_word_count jest jeszcze prościej.
// Pobierz wszystkie notatki
$result = mysql_query(SELECT notka FROM notatnik) or die();

// Dla każdej notatki
while ($row = mysql_fetch_Assoc($result)) {
// Weź pole "notka"
$notka = $row['notka'];

// Usuń dziwne znaki a tag <br> zamień na spację
$notka = preg_replace(array('/[,.\-\'+;:?!()]/i', '/<br>/'), array('', ' '), $notka);

// Usuń wszytkie zbędne tagi
$notka = strip_tags($notka);

foreach (str_word_count($notka, 1) as $slowo) {
$sql = "INSERT INTO words (word, counter) VALUES ('$slowo', 1)
ON DUPLICATE KEY UPDATE counter = counter + 1";
mysql_query($sql);
}
}
Robert Rawicz

Robert Rawicz Motorbike mechanic,
The Good Bike Jette
- Brussels SUZUKI...

Temat: dzielenie stringu (zdania) na slowa i zapis slow do tabeli

Super, dzięki za poświęcony czas na analizę kodu. Twoje poprawki mają sens. Orłem w PHP nie jestem, ale po Twojej lekturze jestem krok w przód.
Robert Rawicz

Robert Rawicz Motorbike mechanic,
The Good Bike Jette
- Brussels SUZUKI...

Temat: dzielenie stringu (zdania) na slowa i zapis slow do tabeli

musze jednak coś pogrzebać w Twoim kodzie bo zwraca mi wartości do tabeli words dość dziwne
np. słowo z polskimi literami dzieli mi na części (łamie mi słowo w miejscu gdzie występuje polski znak, chociaż już samą polską literę wywala)

słowo "głośnika" podzielone na części (z pominięciem polskich liter:


tabela "words"

(...)
(48, 'brak', 1),
(49, 'rezystora', 1),
(50, 'dla', 1),
(51, 'g', 1),
(52, 'o', 1),
(53, 'nika', 1),
(54, 'radia', 1),
(...)



oraz nie inkrementuje licznika jeżeli słowo już jest w tabeli, no chyba że ja mam coś źle zdefiniowane pole 'word' w samej tabeli? :


tabela "words"

(...)
(675, 'na', 1),
(676, 'chwil', 1),
(677, 'i', 1),
(678, 'zaraz', 1),
(679, 'potem', 1),
(680, 'potem', 1),
(681, 'Potem', 1),
(682, 'czaszka', 1),
(683, 'uszkodzony', 1),
(684, 'tylny', 1),
(685, 'prawy', 1),
(...)


co ciekawe pierwszy zaproponowany przez Ciebie kod nie rozbija słów tam gdzie są polskie litery ale też nie inkrementuje licznika w przypadku duplikatuTen post został edytowany przez Autora dnia 05.02.16 o godzinie 23:59
Marcin Mackiewicz

Marcin Mackiewicz Programista JAVA, RS
Adware Polska

Temat: dzielenie stringu (zdania) na slowa i zapis slow do tabeli

Tak jak mówiłem, nie sprawdzałem kodu tylko z głowy napisałem.
Funkcja str_word_count niepoprawnie działa w przypadku polskich znaków. Przepraszam, nie sprawdziłem tego.

Kod działa poprawnie. SQL każe podbić licznik "ON DUPLIKATE KEY" czyli wykonaj coś jeżeli klucz główny został powtórzony. Teraz wychodzi szydło, że u Ciebie klucz główny to liczba (pewnie z autoincement). Jak wywalisz id a wyraz zrobisz kluczem głównym będzie działało poprawnie.
Jeżeli koniecznie musi być id to spróbowałbym coś takiego
INSERT INTO words (id, word, counter)
SELECT id, word, counter FROM (
SELECT id, word, counter FROM words WHERE word = 'to'
UNION SELECT COALESCE(MAX(id)+1, 1), 'to', 1 FROM words
) AS ret ORDER BY id LIMIT 1
ON DUPLICATE KEY UPDATE counter = values(counter) + 1;
ale auto_incement trzeba wywalić. Zapytanie sql szuka danych dla danego słowa i tworzy nowy wiersz. Jeżeli znaleziono już takie słowo to podbija licznik a jeżeli nie to robi insert.
Tu działa tak, że zawsze podbija licznik wyrazu o najniższym id, czyli jeżeli występują powtórzenia to nie będą podbijane.Ten post został edytowany przez Autora dnia 06.02.16 o godzinie 09:42
Robert Rawicz

Robert Rawicz Motorbike mechanic,
The Good Bike Jette
- Brussels SUZUKI...

Temat: dzielenie stringu (zdania) na slowa i zapis slow do tabeli

Zrobilem tak jak napisales, wywalilem ID z autoincrementem a dalem klucz na slowo i dziala.

Jeszcze tylko kwestia polskich liter pozostala do rozwiazania :(
Marcin Mackiewicz

Marcin Mackiewicz Programista JAVA, RS
Adware Polska

Temat: dzielenie stringu (zdania) na slowa i zapis slow do tabeli

Użyj wersji z "preg_replace" ale zamiast wymieniać znaki do usunięcia usuń wszystko z wyjątkiem liter, cyfr, spacji oraz polskich znaków
$notka = preg_replace(array('/<br>/', '/[^a-z0-9ąężśźćółń ]+/i'), array(' ', ''), $notka);
Bo tu np zapomnieliśmy o cudzysłowiach i przy cytacie "Litwo! Ojczyzno moja" miałbyś wyraz w bazie "Litwo oraz moja" jako różne wyrazy. Jak się zastanawiam to w INSERT przydałoby się jeszcze robić LOWER() albo UPPER() żeby znieczulić na małe/duże litery.



Wyślij zaproszenie do