• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 294
  • Last Modified:

Word Manipulation

Hi,

I'm looking for a way to generate all possible combinations of keywords.

The file has 500K+ records formatted in the following way (3 rows with tabs)

smart      convention      largest

The output I'm looking for should generate all possible combinations and sorround the output in ()

(smart convention largest)
(smart largest convention)
(largest convention smart)
(largest smart convention)
(convention smart largest)
(convention largest smart)
0
faithless1
Asked:
faithless1
1 Solution
 
vikas_madhusudanaCommented:
input the file to the shell scrpt

#!/bin/sh
#num=`wc -l $1`
for a in `seq 500000`
do
b=`head -n $a $1 | tail -n 1`
var1=`echo $b | cut -d " " -f 1`
var2=`echo $b | cut -d " " -f 2`
var3=`echo $b | cut -d " " -f 3`
echo "("$var1 $var2 $var3")"
echo "("$var1 $var3 $var2")"
echo "("$var2 $var1 $var3")"
echo "("$var2 $var3 $var1")"
echo "("$var3 $var2 $var1")"
echo "("$var3 $var1 $var2")"
done

Open in new window

0
 
Marco GasiFreelancerCommented:
I would do it this way. First, Iwould create three array, each for column, wich grab column values. I never done this, but if you post a little sample file equal to yours I cant test.

Then You create a multidimansional array with three ayyay $smart, $convention and $largest

$totArr = array($smart, $convention, $largest);

Last you can use the snippet posted below to generate all combinations.

Hope this helps
//combination algorithm
function generateCodes($arr) {
    global $returnArray, $tempArray, $pos;
    if(count($arr)) {
        for($i=0; $i<count($arr[0]); $i++) {
            $tmp = $arr;
            $tempArray[$pos] = $arr[0][$i];
            $tarr = array_shift($tmp);
            $pos++;
            generateCodes($tmp);
        }
    } else {
        $returnArray[] = strtoupper(join("", $tempArray));
    }
    $pos--;
}


//How to use:
$returnArray = array();
$tempArray = array();
$pos = 0;
generateCodes($totArr);
foreach($returnArray as $value){
  echo $value."£<br />";
}

Open in new window

0
Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
VanHackmanCommented:
Here is the solution with a test case file, in order that you see it works. =P
Just put both files in the same directory and try them. ;)

PD:
<?php
header("Content-Type:text/plain");

$WordSource = file("WordSource.txt");

foreach($WordSource as $line)
{
	$Words = explode("\t", str_replace("\n",'',trim($line)));
	scramble($Words[0],$Words[1],$Words[2]);
}

function scramble($Word1, $Word2, $Word3)
{
	echo "($Word1 $Word2 $Word3)\n";
	echo "($Word1 $Word3 $Word2)\n";
	echo "($Word2 $Word1 $Word3)\n";
	echo "($Word2 $Word3 $Word1)\n";
	echo "($Word3 $Word2 $Word1)\n";
	echo "($Word3 $Word1 $Word2)\n";
}

?>

Open in new window

WordSource.txt
0
 
Ray PaseurCommented:
This seems to work correctly.  Install it and run it on your server and please post back with any questions, ~Ray
<?php // RAY_temp_failthless1.php
error_reporting(E_ALL);
echo "<pre>" . PHP_EOL;



// TEST DATA FROM THE DESCRIPTION AT EE
$dat = <<<DAT
smart      convention      largest
cat dog pig
coffee tea     me you
DAT;



// INTERPRET THE TEST DATA INTO AN ARRAY OF ARRAYS
$new = array();

// MAN PAGE: http://us.php.net/manual/en/function.explode.php
$arr = explode(PHP_EOL, $dat);
foreach ($arr as $str)
{
    // EXAMPLE 5 MAN PAGE: http://us.php.net/manual/en/function.preg-replace.php
    $str = trim(preg_replace('/\s\s+/', ' ', $str));
    $new[] = explode(' ', $str);
}
// ACTIVATE THIS TO SEE THE NEW ARRAY OF ARRAYS
// var_dump($new);



// CREATE THE COMBINATIONS
foreach ($new as $sub)
{
    $sub_combos[] = array_combinations($sub);
}
// ACTIVATE THIS TO SEE THE COMBINATIONS
// var_dump($sub_combos);



// CREATE THE PARENTHESIZED STRINGS
$answer = '';
foreach ($sub_combos as $array_set)
{
    foreach ($array_set as $final_array)
    {
        $answer .= '(' . implode(' ', $final_array) . ')' . PHP_EOL;
    }
    $answer .= PHP_EOL; // READABILITY
}
// SHOW THE WORK PRODUCT
echo $answer;


// GENERATE THE COMBINATIONS OF CHARACTERS IN A STRING.
// OUTPUT IS AN ARRAY OF COUNT = strlen() FACTORIAL
// ADAPTED FROM http://cogo.wordpress.com/2008/01/08/string-permutation-in-php/
function string_combinations($str)
{
    if (strlen($str) < 2) return array($str);

    $combos = array();
    $endpop = substr($str, 1);

    // RECURSE
    foreach (string_combinations($endpop) as $permutation)
    {
        $length = strlen($permutation);
        for ($i = 0; $i <= $length; $i++)
        {
            $combos[] = substr($permutation, 0, $i) . $str[0] . substr($permutation, $i);
        }
    }
    return $combos;
}

// GENERATE THE COMBINATIONS OF ELEMENTS IN A ONE-DIMENSIONAL ARRAY
function array_combinations($arr)
{
    $return = array();

    // GET THE NUMERIC KEY RANGE OF THE INPUT ARRAY
    $str = implode('', range(0, count($arr)-1));

    // GET THE KEY COMBINATIONS
    $combos = string_combinations($str);

    // ITERATE OVER THE COMBINATIONS
    foreach ($combos as $combo)
    {
        $out = array();
        while (strlen($combo))
        {
           $key   = substr($combo,0,1);
           $combo = substr($combo,1);
           $out[] = $arr[$key];
        }
        $return[] = $out;
    }
    return $return;
}

Open in new window

0
 
shanikawmCommented:
Following perl shell command will help
perl -ne 'chomp; 
print "(",$_,")\n("; 
split(/[ \s]+/); 
print join(" ",($_[0],$_[2],$_[1])),")\n(",
join(" ",($_[1],$_[0],$_[2])),")\n(",
join(" ",($_[1],$_[2],$_[0])),")\n(",
join(" ",($_[2],$_[0],$_[1])),")\n(",
join(" ",($_[2],$_[1],$_[0])),")\n";' file.txt 

Open in new window

0

Featured Post

What does it mean to be "Always On"?

Is your cloud always on? With an Always On cloud you won't have to worry about downtime for maintenance or software application code updates, ensuring that your bottom line isn't affected.

Tackle projects and never again get stuck behind a technical roadblock.
Join Now