پی ایچ پی میں عبارتوں کا موازنہ کرنے والی ایپلیکیشن بنائیں

دو عبارتوں کے موازنے کا مطلب یہ ہے کہ ان کے درمیان فرق اور مماثلت معلوم کی جائے۔ مثلاً میں اپنے کسی پرانے مضمون کو بہتر بنانے کے لیے اس کی ایک نقل بنا کر اس میں تبدیلیاں کروں گا۔ ان تبدیلیوں کے بعد میں چاہوں گا کہ ان دونوں مضامین کا آپس میں موازنہ کر کے معلوم کروں کہ تبدیل شدہ تحریر پہلی تحریر سے کس قدر بہتر ہے۔ چنانچہ یہ ٹیکسٹ پراسیسنگ کا ایک مسئلہ ہے جسے کمپیوٹر پروگرامنگ کے ذریعے حل کیا جا سکتا ہے اور اس ٹٹوریل میں ہم یہی کرنے کی کوشش کریں گے۔ اس مقصد کے لیے ہم PHP استعمال کرتے ہوئے ایک چھوٹی سی ویب ایپلیکیشن بنائیں گے جو دو عبارتوں کا موازنہ کرنے میں ہماری مدد کرے گی۔


پہلے ہم چند اسکرین شاٹس کی مدد سے اس ویب ایپلیکیشن کا استعمال دیکھیں گے، اس کے بعد کوڈ کی وضاحت کی جائے گی۔


درج ذیل اسکرین شاٹ میں آپ دیکھ سکتے ہیں کہ عبارتوں کے موازنہ سے پہلے ہم کچھ سیٹنگز کر سکتے ہیں۔ (1) مثلاً پہلا آپشن جو کہ ایک سلائیڈر ہے اس کی مدد سے یہ بتایا جا سکتا ہے کہ کوئی لفظ دونوں عبارتوں میں کتنے لفظوں کے فاصلے پر ہو تو وہ رینج کے اندر متصور ہوگا۔ (2) دوسرا آپشن رنگوں کا ہے جس میں بتایا گیا ہے کہ اگر دونوں عبارتوں میں لفظ کی پوزیشن ایک جیسی ہے تو اس پر سبز رنگ استعمال کیا جائے۔ اگر دونوں عبارتوں میں اوپر دی گئی رینج کے اندر لفظ ہے تو پھر ٹیل جو کہ سبز رنگ کے قریب ہے وہ استعمال کیا جائے۔ اگر ایک عبارت کا لفظ دوسری عبارت میں موجود ہے لیکن رینج میں نہیں ہے تو پھر اس پر نیلا رنگ استعمال کیا جائے۔ جبکہ ایک عبارت کا لفظ اگر دوسری عبارت میں موجود نہیں ہے تو اس پر سرخ رنگ استعمال کیا جائے۔ (3) اس کے بعد Stop والا آپشن ہے جسے منتخب کرنے پر چھوٹی عبارت کے سائز کے مطابق بڑی عبارت کی پراسیسنگ کی جائے گی۔ (4) اس کے بعد دو ٹیکسٹ باکسز ہیں جن میں موازنے کے لیے عبارتیں مہیا کی جائیں گی۔


درج ذیل آپ دیکھ سکتے ہیں کہ دونوں عبارتیں بالکل ایک جیسی ہیں اس لیے ایپلیکیشن نے انہیں سبز رنگ میں دکھایا ہے۔


دونوں عبارتوں میں لفظوں کی تعداد ایک جیسی ہے لیکن چند الفاظ ایک دوسرے سے مختلف ہیں جنہیں سرخ رنگ میں دکھایا گیا ہے۔


درج ذیل اسکرین شاٹ ذرا غور طلب ہے۔ (1) آپ دیکھ رہے ہیں کہ Republic والے الفاظ تین جگہوں پر آئے ہیں۔ دونوں عبارتوں کی پہلی لائن پر موجود یہ الفاظ چونکہ رینج کے اندر ہیں اس لیے ان پر ٹیل رنگ استعمال کیا گیا ہے۔ اور چونکہ چائنہ کے ساتھ Republic والے الفاظ پہلی عبارت میں موجود تو ہیں لیکن رینج میں نہیں ہیں اس لیے ان پر نیلا رنگ استعمال ہوا ہے۔ (2) اسی طرح دونوں عبارتوں میں Oman کا لفظ تین جگہ موجود ہے۔ جہاں یہ لفظ رینج میں ہے وہاں ٹیل رنگ میں دکھایا گیا ہے اور جہاں یہ لفظ رینج میں نہیں وہاں نیلے رنگ میں دکھایا گیا ہے۔ (3) جبکہ دوسری عبارت کے آخر میں جو Oman کا لفظ ہے اس پر سرخ رنگ اس لیے استعمال ہوا ہے کہ وہ پہلی عبارت میں فل اسٹاپ کے نشان کے ساتھ موجود نہیں ہے۔


درج ذیل آپ دیکھ رہے ہیں کہ اس مرتبہ عبارتوں کے موازنے کے لیے Stop والا آپشن منتخب کیا گیا ہے۔ اس آپشن کا استعمال وہاں مفید ہے جہاں آپ یہ دیکھنا چاہیں کہ پہلی عبارت کی بہ نسبت دوسری عبارت میں کتنا اضافہ ہے۔


آپ دیکھ سکتے ہیں کہ دونوں عبارتوں کا پہلا حصہ ایک جیسا ہے لیکن دوسری عبارت میں کچھ اضافہ ہے۔


درج ذیل اسکرین شاٹ میں اردو کی دو ملتی جلتی عبارتوں کا موازنہ دکھایا گیا ہے۔


کوڈ کی وضاحت

درج ذیل index.php فائل کا کوڈ دکھایا جا رہا ہے۔ (1) اس کے فارم کے اندر پہلے range والی ان پٹ فیلڈ موجود ہے جس کی مدد سے الفاظ کی رینج بتائی جائے گی۔ اس فیلڈ کا کوڈ کچھ لمبا اس لیے ہوگیا ہے کہ اس میں سلائیڈر کی ویلیو دکھانے کے لیے جاوا اسکرپٹ کوڈ استعمال کیا گیا ہے کیونکہ ڈیفالٹ کے طور پر سلائیڈر کی ویلیو نہیں دکھائی جاتی۔ (2) اس کے بعد چار عدد color ٹائپ کی ان پٹ فیلڈز ہیں جن کی مدد سے لفظوں کی پوزیشن کے مطابق ان کے لیے رنگ مقرر کیے جا سکتے ہیں۔ اس مقصد کے لیے ڈراپ ڈاؤن مینیو کا آپشن زیادہ بہتر تھا لیکن چار رنگوں کے لیے وہ کوڈ میں کافی جگہ لے لیتے۔ (3) پھر ایک چیک باکس ہے جس میں Stop والا آپشن ہے۔ (4) اور پھر دو ٹیکسٹ باکسز ہیں جن میں موازنے کے لیے دو عبارتیں مہیا کی جائیں گی۔

<?php
$default_text = "Pakistan, officially the Islamic Republic of Pakistan, is a country in South Asia. It is the fifth-most populous country with a population exceeding 209,970,000 people. In area, it is the 33rd-largest country, spanning 881,913 square kilometres (340,509 square miles). Pakistan has a 1,046-kilometre (650-mile) coastline along the Arabian Sea and Gulf of Oman in the south and is bordered by India to the east, Afghanistan to the west, Iran to the southwest, and China in the far northeast. It is separated narrowly from Tajikistan by Afghanistan's Wakhan Corridor in the northwest, and also shares a maritime border with Oman.";
?>
 
<!doctype html>
<html>
<head>
	<title>Text Comparison</title>
	<style>
		body {
			font-family:times new roman;
			font-size:13px;
			padding:0 0 0 20px;
		}
		textarea {
			font-family:times new roman;
			width:650px;
			font-size:13px;height:90px;
			padding:5px;
		}
	</style>
</head>
<body>
	<form action="result.php" method="post">
 
		<h1>Text Comparison</h1>
 
		<p>
		<label for="nearby-range">Nearby range</label><br>
		<input id="nearby-range" name="nearby-range" type="range" min="1" max="15" value="5" 
			onchange="document.getElementById('range-value').innerHTML = document.getElementById('nearby-range').value;">
		<span id="range-value">5</span>
		</p>
 
 
		<p>
		<input id="color-same-position" name="color-same-position" type="color" value="#008000"> 
		<label for="color-same-position">Word at same position</label>
		</p>
 
		<p>
		<input id="color-within-range" name="color-within-range" type="color" value="#008080"> 
		<label for="color-within-range">Word within range</label>
		</p>
 
		<p>
		<input id="color-out-of-range" name="color-out-of-range" type="color" value="#cc6900"> 
		<label for="color-out-of-range">Word out of range</label>
		</p>
 
		<p>
		<input id="color-not-found" name="color-not-found" type="color" value="#FF0000"> 
		<label for="color-not-found">Word not found</label>
		</p>
 
		<p>
		<input id="beyond-length-process" name="beyond-length-process" type="checkbox"> 
		<label for="beyond-length-process">Stop processing where one text is longer than the other</label>
		</p>
 
		<p>
		<label for="text1">Text 1</label><br>
		<textarea id="text1" name="text1" required><?php print $default_text; ?></textarea>
		</p>
 
		<p>
		<label for="text2">Text 2</label><br>
		<textarea id="text2" name="text2" required><?php print $default_text; ?></textarea>
		</p>
 
		<input type="submit" name="submit-button" value="Go">
 
	</form>
</body>
</html>


درج ذیل result.php فائل کا کوڈ دکھایا جا رہا ہے، اس میں کامنٹس کی مدد سے آپ کوڈ کا مقصد سمجھ سکتے ہیں۔ آپ دیکھ سکتے ہیں کہ ٹیکسٹ کے موازنے کے لیے compare_text فنکشن استعمال کیا گیا ہے تاکہ دونوں عبارتوں کے لیے ایک ہی کوڈ استعمال ہو جائے، چنانچہ اس فنکشن کو کال کرتے وقت صرف اس کے پہلے دو پیرامیٹرز کی ترتیب تبدیل کرنا ہوگی۔

<?php
 
if (!isset($_POST["submit-button"])) {
 
	// اگر پچھلے صفحہ پر عبارتیں مہیا نہیں کی گئیں تو واپس پچھلے صفحے پر جاؤ
	header("location:index.php");
 
} else {
 
	$text1 = $_POST["text1"];
	$text2 = $_POST["text2"];
 
	$nearby_range = $_POST["nearby-range"];
	$color_same_position = $_POST["color-same-position"];
	$color_within_range = $_POST["color-within-range"];
	$color_out_of_range = $_POST["color-out-of-range"];
	$color_not_found = $_POST["color-not-found"];
	$beyond_length_process = $_POST["beyond-length-process"];
 
}
 
// پہلی عبارت کا دوسری عبارت کے ساتھ موازنہ کرو
$text1_colored = compare_text($text1, $text2, $nearby_range, $color_same_position, $color_within_range, $color_out_of_range, $color_not_found, $beyond_length_process);
// دوسری عبارت کا پہلی عبارت کے ساتھ موازنہ کرو
$text2_colored = compare_text($text2, $text1, $nearby_range, $color_same_position, $color_within_range, $color_out_of_range, $color_not_found, $beyond_length_process);
 
?>
 
<!doctype html>
<html>
<head>
	<title>Text Comparison</title>
	<style>
		body {
			font-family:times new roman;
			padding:10px;
		}
		.div-column {
			float:left;
			width:50%;
			box-sizing:border-box;
			padding-right:20px;
		}
	</style>
</head>
<body>
 
		<h1>Result</h1>
		<?php
			// دونوں رنگ دار عبارتیں اسکرین پر پرنٹ کرو
			if (isset($text1_colored) && isset($text2_colored)) {
				print "<div class='div-column'>" . $text1_colored . "</div>";
				print "<div class='div-column'>" . $text2_colored . "</div>";
			}
		?>
</body>
</html>
 
 
 
<?php 
 
function compare_text($text_source, $text_target, $nearby_range, $color_same_position, $color_within_range, $color_out_of_range, $color_not_found, $beyond_length_process) {
 
	// عبارتوں کے اندر موجود ڈبل اسپیسز کو سنگل اسپیس میں تبدیل کرو
	while (strpos($text_source, "  ")) {
		$text_source = str_replace("  ", " ", $text_source);
	}
	while (strpos($text_target, "  ")) {
		$text_target = str_replace("  ", " ", $text_target);
	}
 
	// ہر عبارت کو اررے میں تبدیل کرو
	$words_source = explode(" ", $text_source);
	$words_target = explode(" ", $text_target);
 
	$words_target_length = sizeof($words_target);
 
	// چھوٹے اررے کے آخر میں خالی ویلیوز کا اضافہ کر کے دونوں ارریز کا سائز ایک جیسا کرو
	if (sizeof($words_source) < sizeof($words_target)) {
		$words_source = array_pad($words_source, sizeof($words_target), "");
	} else if (sizeof($words_target) < sizeof($words_source)) {
		$words_target = array_pad($words_target, sizeof($words_source), ""); 
	}
 
	// الفاظ کو رنگوں کے ساتھ محفوظ کرنے کے لیے پہلے اررے کی ایک نقل بناؤ
	$words_source_colored = $words_source;
 
	// تمام الفاظ کا لوپ
	for ($i = 0; $i < sizeof($words_source); $i++) {
 
		// قریبی الفاظ کا لوپ
		for ($k = 0; $k <= $nearby_range; $k++) {
 
			// اگر دونوں عبارتوں میں لفظ کی پوزیشن یکساں ہے 
			if (isset($words_source[$i]) && $words_source[$i] == $words_target[$i]) {
				$words_source_colored[$i] = "<span style='color:" . $color_same_position . "'>" . $words_source[$i] . "</span>";
 
			// اگر پہلی عبارت میں لفظ پیچھے والی رینج میں ہے
			} else if (isset($words_source[$i-$k]) && $words_source[$i-$k] == $words_target[$i]) {
				$words_source_colored[$i-$k] = "<span style='color:" . $color_within_range . "'>" . $words_source[$i-$k] . "</span>";
 
			// اگر پہلی عبارت میں لفظ آگے والی رینج میں ہے
			} else if (isset($words_source[$i+$k]) && $words_source[$i+$k] == $words_target[$i]) {
				$words_source_colored[$i+$k] = "<span style='color:" . $color_within_range . "'>" . $words_source[$i+$k] . "</span>";
 
			// اگر پہلی عبارت کا لفظ دوسری عبارت میں کہیں بھی موجود ہے
			} else if (in_array($words_source[$i], $words_target) && !strpos($words_source_colored[$i], "span")) {
				$words_source_colored[$i] = "<span style='color:" . $color_out_of_range . "'>" . $words_source[$i] . "</span>";
			}
 
		}
 
		// اگر صارف نے پہلی عبارت کے اختتام پر رکنے کا آپشن منتخب کیا ہے
		if ($beyond_length_process == "on" && $i == $words_target_length) {
			break;
		}
 
	} 
 
	// رنگ دار الفاظ پر مشتمل اررے کو ٹیکسٹ میں تبدیل کر کے بھیجو
	return "<div style='color:" . $color_not_found . "'>" . implode(" ", $words_source_colored) . "</div>";
 
}
 
?>


مزید اقدامات کی ضرورت

  • عبارتوں کے موازنے کا یہ الگورتھم ابتدائی درجے کا ہے اور اس میں بہتری کی بہت زیادہ گنجائش موجود ہے لیکن پھر بھی یہ چھوٹی عبارتوں کے موازنے کے لیے کافی کام دے سکتا ہے۔
  • اس کوڈ میں لائن بریکس کو لحاظ نہیں رکھا گیا۔ اگر آپ نتیجے میں لائن بریکس کو اسی طرح شامل کرنا چاہیں جس طرح اصل عبارت میں ہیں تو پھر عبارت کو پراسیس کرنے سے پہلے لائن بریکس یعنی n\ کے ہر نشان کو کسی عارضی سیمبل میں تبدیل کر لیں اور عبارت پراسیس ہونے کے بعد ان عارضی سیمبلز کو دوبارہ لائن بریکس میں تبدیل کر لیں۔
  • آپ نے شاید نوٹس کیا ہوگا کہ وہ loop جس کی مدد سے ہم تمام الفاظ الگ الگ پراسیس کرتے ہیں اس کی مدد سے شماریات کا کافی ڈیٹا جمع کیا جا سکتا ہے۔ مثلاً ہر عبارت کے کل الفاظ کتنے ہیں، کتنے الفاظ ایک جیسی پوزیشن پر ہیں، کتنے رینج کے اندر ہیں، اور کتنے رینج سے باہر ہیں۔ اسی طرح PHP کے array_count_values فنکشن کی مدد یہ معلوم کیا جا سکتا ہے کہ عبارت میں کون سا لفظ سب سے کم اور کون سا سب سے زیادہ استعمال ہوا ہے وغیرہ۔
Categories: