Нет API, о которых я знаю.Однако вы можете попробовать SQL-предложение.
$words = explode(' ', 'Eminem is a hip hop star');
$len = count($words);
$fixed = array();
for($x = 0; $x < $len; $x++) {
//LIKE 'hip %' will match hip hop
$q = mysql_query("SELECT word FROM dict WHERE word LIKE '".$words[$x]." %'");
//Combine current and next word
$combined = $words[$x].' '.$words[($x+1)];
while( $result = mysql_fetch_array($q)) {
if($result['word'] == $combined) { //Word is in dictionary
$fixed[] = $combined;
$x++;
} else { //Word isn't in dictionary
$fixed[] = $words[$x];
}
}
}
* Пожалуйста, извините за отсутствие PDO.Я сейчас ленивый.
РЕДАКТИРОВАТЬ: Я задумался.Хотя приведенный выше код не является оптимальным, оптимизированная версия, которую я придумала, вероятно, не может быть намного лучше.Дело в том, что независимо от того, как вы подходите к проблеме, вам нужно будет сравнить каждое слово во входном предложении со словарем и выполнить дополнительные вычисления.Я вижу два подхода, которые вы можете использовать в зависимости от аппаратных ограничений.
Оба эти метода предполагают таблицу dict
со структурой (пример):
+--+-----+------+
|id|first|second|
+--+-----+------+
|01|hip |hop |
+--+-----+------+
|02|grade|school|
+--+-----+------+
Вариант 1: Вашвеб-сервер имеет много доступной оперативной памяти (и приличный процессор)
Идея здесь состоит в том, чтобы полностью обойти слой базы данных, кэшируя словарь в памяти PHP (с помощью APC или memcache, последний, если вы планируетезапустить на нескольких серверах).Это возьмет на себя всю нагрузку на ваш веб-сервер, однако это может быть значительно быстрее, поскольку доступ к кэшированным данным из ОЗУ намного быстрее, чем запросы к вашей БД.
(Опять же, я упустил PDO и Sanitization для простотыради)
// Step One: Cache Dictionary..the entire dictionary
// This could be run on server start-up or before every user input
if(!apc_exists('words')) {
$words = array();
$q = mysql_query('SELECT first, second FROM dict');
while($res = mysql_fetch_array($q)) {
$words[] = array_values($res);
}
apc_store('words', serialize($words)); //You could use memcache if you want
}
// Step Two: Compare cached dictionary to user input
$data = explode(' ', 'Eminem is a hip hop star');
$words = apc_fetch('words');
$count = count($data);
for($x = 0; $x < $count; $x++) { //Simpler to use a for loop
foreach($words as $word) { //Match against each word
if($data[$x] == $word[0] && $data[$x+1] == $word[1]) {
$data[$x] .= ' '.$word[1];
array_splice($data, $x, 1);
$count--;
}
}
}
Вариант 2: быстрый SQL Server Второй вариант включает запрос каждого слова во входном тексте с сервера SQL.Например, для предложения «Eminem is hip hop» вы должны создать запрос, который будет выглядеть как SELECT * FROM dict WHERE (first = 'Eminem' && second = 'is') || (first = 'is' && second = 'hip') || (first = 'hip' && second = 'hop')
.Затем, чтобы исправить массив слов, вы просто просматриваете результаты MySQL и объединяете подходящие слова.Если вы хотите пойти по этому пути, может быть более эффективно кешировать часто используемые слова и исправлять их, прежде чем обращаться к базе данных.Таким образом, вы можете исключить условия из вашего запроса.