Autor Zpráva
Mech
Profil *
Zdravím, mám text a potřeboval bych z něj vytáhnout seznam pěti nejčastěji opakovaných slov.
Mohl by mi někdo poradit jak na to?

Dík.
Jostram
Profil *
obecně?

1. převést text na lowercase
2. "rozsekat" na jednotlivá slova (do pole)
3. projít pole a inkrementovat pole s indexem toho slova (například)
4. seřadit pole a vypsat X největších čísel

Chcete-li to v nějakém konkrétním jazyce, musíte to napsat.
Mech
Profil *
Chtěl bych to PHP.
První bod bych určitě zvládl, ale k polím jsem se ještě nedostal. :)

Díky moc.
Jostram
Profil *
To skoro znamená, že byste se měl podívat třeba sem nebo sem, že? ;-)

Pokud budu předpokládat, že se nechcete prozatím mordovat s regulárnímy výrazy, tak to zkuste zhruba takto:
bod 1: Nejprve bych odstranil diakritiku - třeba takto. Poté bych převedl text na lowercase pomocí funkce strtolower().
bod 2: Na "rozsekávání" řetězce do pole můžete pro začátek použít funkci explode().
bod 3: Na procházení toho pole můžete použít konstrukci foreach. A inkrementace je vysvětlená zde.
bod 4: Na seřazení pole třeba funkci sort(). A vypsání posledních pěti výsledků už nechám na vaší kreativitě ;)


Rád vám pomohu, když narazíte na problém, ale doporučuji, abyste to zkusil udělat sám - když vám to sem napíšu, tak vám to nic nedá... Když na to přijdete sám, tak je to fajn pocit a hlavně se naučíte základům.
Mech
Profil *
Takže jsem u jedničky, ale následující kód mi nechce udělat z Č malé písmeno a následně odstranit diakritiku. Kde jsem udělal chybu?

$prevodni_tabulka = Array(
  'ä'=>'a',
  'Ä'=>'A',
  'á'=>'a',
  'Á'=>'A',
  'à'=>'a',
  'À'=>'A',
  'ã'=>'a',
  'Ã'=>'A',
  'â'=>'a',
  'Â'=>'A',
  'č'=>'c',
  'Č'=>'C',
  'ć'=>'c',
  'Ć'=>'C',
  'ď'=>'d',
  'Ď'=>'D',
  'ě'=>'e',
  'Ě'=>'E',
  'é'=>'e',
  'É'=>'E',
  'ë'=>'e',
  'Ë'=>'E',
  'è'=>'e',
  'È'=>'E',
  'ê'=>'e',
  'Ê'=>'E',
  'í'=>'i',
  'Í'=>'I',
  'ï'=>'i',
  'Ï'=>'I',
  'ì'=>'i',
  'Ì'=>'I',
  'î'=>'i',
  'Î'=>'I',
  'ľ'=>'l',
  'Ľ'=>'L',
  'ĺ'=>'l',
  'Ĺ'=>'L',
  'ń'=>'n',
  'Ń'=>'N',
  'ň'=>'n',
  'Ň'=>'N',
  'ñ'=>'n',
  'Ñ'=>'N',
  'ó'=>'o',
  'Ó'=>'O',
  'ö'=>'o',
  'Ö'=>'O',
  'ô'=>'o',
  'Ô'=>'O',
  'ò'=>'o',
  'Ò'=>'O',
  'õ'=>'o',
  'Õ'=>'O',
  'ő'=>'o',
  'Ő'=>'O',
  'ř'=>'r',
  'Ř'=>'R',
  'ŕ'=>'r',
  'Ŕ'=>'R',
  'š'=>'s',
  'Š'=>'S',
  'ś'=>'s',
  'Ś'=>'S',
  'ť'=>'t',
  'Ť'=>'T',
  'ú'=>'u',
  'Ú'=>'U',
  'ů'=>'u',
  'Ů'=>'U',
  'ü'=>'u',
  'Ü'=>'U',
  'ù'=>'u',
  'Ù'=>'U',
  'ũ'=>'u',
  'Ũ'=>'U',
  'û'=>'u',
  'Û'=>'U',
  'ý'=>'y',
  'Ý'=>'Y',
  'ž'=>'z',
  'Ž'=>'Z',
  'ź'=>'z',
  'Ź'=>'Z'
);
$text = strtr($text, $prevodni_tabulka); //odstranění diakritiky
$text = strtolower($text); //převod na malá písmena
echo $text . "<p>";
Jostram
Profil *
Ukažte tady celou tu stránku, ve které je ten skript. Kód je správně - viz:

<?php
$text="Příliš žluťoučký kůn pěl ďábelké ódy. PŘÍLIŠ ŽLUŤOUČKÝ KŮN PĚL ĎÁBELKÉ ÓDY.";

// Trochu jsem "osekal" tabulku znaků - jsou tam jen české
$prevodni_tabulka = Array(      'á'=>'a', 'Á'=>'A', 'č'=>'c', 'Č'=>'C',
  'ď'=>'d', 'Ď'=>'D', 'ě'=>'e', 'Ě'=>'E', 'é'=>'e', 'É'=>'E', 'è'=>'e',
  'È'=>'E', 'í'=>'i', 'Í'=>'I', 'ň'=>'n', 'Ň'=>'N', 'ó'=>'o', 'Ó'=>'O',
  'ř'=>'r', 'Ř'=>'R', 'š'=>'s', 'Š'=>'S', 'ť'=>'t', 'Ť'=>'T', 'ú'=>'u',
  'Ú'=>'U', 'ů'=>'u', 'Ů'=>'U', 'ý'=>'y', 'Ý'=>'Y', 'ž'=>'z', 'Ž'=>'Z'
	);

// "Oloupeme" diakritiku
$text = strtr($text, $prevodni_tabulka);

echo 'Bez diakritiy: '.$text."\n";

//převod na malá písmena
$text = strtolower($text); 

echo 'Lowercase :'.$text;
?>

Vrací
Bez diakritiy: Prilis zlutoucky kun pel dabelke ody. PRILIS ZLUTOUCKY KUN PEL DABELKE ODY.
Lowercase :prilis zlutoucky kun pel dabelke ody. prilis zlutoucky kun pel dabelke ody.
Mech
Profil *
Text načítám z textarey.
Ani s tvým kódem mi to nefunguje. Co je špatně?


<form action="<?=$_SERVER['PHP_SELF'];?>" method="post">
<textarea name="text" cols="50" rows="22"><?php echo $_REQUEST['text']; ?></textarea>
<input type="submit" value="OK">
</form>


<?php
if (!empty($_REQUEST['text'])){
$text = strtolower($_REQUEST['text']);
$znaky=strlen($text);

$prevodni_tabulka = Array(      'á'=>'a', 'Á'=>'A', 'č'=>'c', 'Č'=>'C',
  'ď'=>'d', 'Ď'=>'D', 'ě'=>'e', 'Ě'=>'E', 'é'=>'e', 'É'=>'E', 'è'=>'e',
  'È'=>'E', 'í'=>'i', 'Í'=>'I', 'ň'=>'n', 'Ň'=>'N', 'ó'=>'o', 'Ó'=>'O',
  'ř'=>'r', 'Ř'=>'R', 'š'=>'s', 'Š'=>'S', 'ť'=>'t', 'Ť'=>'T', 'ú'=>'u',
  'Ú'=>'U', 'ů'=>'u', 'Ů'=>'U', 'ý'=>'y', 'Ý'=>'Y', 'ž'=>'z', 'Ž'=>'Z'
    );

// "Oloupeme" diakritiku
$text = strtr($text, $prevodni_tabulka);

echo 'Bez diakritiy: '.$text."\n";

//převod na malá písmena
$text = strtolower($text); 

echo 'Lowercase :'.$text;
?>
Jostram
Profil *
Tuším... Jen pár postřehů :
* vyhněte se používání proměnné REQUEST - *lehce* se vám může stát, že si uděláte cookie stejného jména jako GET/POST a než tu chybu najdete, tak se z toho zblázníte.
* Dále tam máte syntaktickou chybu - neuzavřený IF - pokud máte vyplé hlášení chyb, tak vám skript "umře" a vy o tom nebudete vědět.
* Nejdříve odstraňte diakritiku a PAK lowercase. Je to proto, že funkce lowercase se občas chová zláštně v závislosti na kódování.

Zkuste toto:
<form action="test.php" method="POST">
<textarea name="text" cols="50" rows="22"><?php echo $_POST['text']; ?></textarea>
<input type="submit" value="OK">
</form>
<?php
if (!empty($_POST['text'])){
	$prevodni_tabulka = Array(      'á'=>'a', 'Á'=>'A', 'č'=>'c', 'Č'=>'C',
	  'ď'=>'d', 'Ď'=>'D', 'ě'=>'e', 'Ě'=>'E', 'é'=>'e', 'É'=>'E', 'è'=>'e',
	  'È'=>'E', 'í'=>'i', 'Í'=>'I', 'ň'=>'n', 'Ň'=>'N', 'ó'=>'o', 'Ó'=>'O',
	  'ř'=>'r', 'Ř'=>'R', 'š'=>'s', 'Š'=>'S', 'ť'=>'t', 'Ť'=>'T', 'ú'=>'u',
	  'Ú'=>'U', 'ů'=>'u', 'Ů'=>'U', 'ý'=>'y', 'Ý'=>'Y', 'ž'=>'z', 'Ž'=>'Z'
		);

	// "Oloupeme" diakritiku
	$text = strtr($_REQUEST['text'], $prevodni_tabulka);

	//převod na malá písmena
	$text = strtolower($text); 

	echo 'Text'.$text;
}
?>
Mech
Profil *
Podmínku mám ukončenou správně, akorát závorka se mi při kopírování nějak záhadně vytratila. Problém je v tom, že ta diakritika je tam pořád.

Když do textarey zadám toto:

Příliš žluťoučký kůň pěl ďábelské ódy. PŘÍLIŠ ŽLUŤOUČKÝ KŮŇ PĚL ĎÁBELSKÉ ÓDY.


tak vyleze toto:

příliš žluťoučký kůň pěl ďábelské ódy. pŘÍliŠ ŽluŤouČkÝ kŮŇ pĚl ĎÁbelskÉ Ódy.


Fakt už nevím, co s tím. :(
Jostram
Profil *
Z toho, co jsem vám poslal? Jak jsem psal - strtolower() musí jít až *poté*, co projde odebrání diakritiky.
Mech
Profil *
Ano, příspěvek [#9] se vztahuje k vašemu kódu.
ninja
Profil
Mech: Jaké používáte kódování?
Mech
Profil *
Tak už mi to s tou diakritkou konečně funguje.
Akorát nechápu, jak konkrétně udělat to řazení pomocí foreach. Poradíte, prosím?
Mech
Profil *
Už jsem to nějak splácal dohromady. :)

Díky za pomoc.

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0