Как разобрать слово / фразу с двумя словами в словарной базе данных (на PHP) - PullRequest
1 голос
/ 25 августа 2011

Я хочу разобрать предложение в слова, но в некоторых предложениях есть два слова, которые можно объединить в одно и привести к другому значению.

Например:

Эминем - звезда хип-хопа.

Если я проанализирую это, разделив слова на пробелы, я получу

Eminem
is
a
**hip**
**hop**
star

но я хочу что-то вроде этого:

Eminem
is
a
**hip hop**
star

Это всего лишь пример; могут быть некоторые другие словосочетания, перечисленные в словаре как слова.

Как я могу легко разобрать это?

У меня есть словарь в базе данных MySQL. Есть ли API для этого?

1 Ответ

1 голос
/ 25 августа 2011

Нет 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 и объединяете подходящие слова.Если вы хотите пойти по этому пути, может быть более эффективно кешировать часто используемые слова и исправлять их, прежде чем обращаться к базе данных.Таким образом, вы можете исключить условия из вашего запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...