Модификация заголовков PHP

0

Я разрабатываю сценарий, который предназначен для academer.google.com. Скрипт должен изменить названия статей, полученные с http://www.ncbi.nlm.nih.gov/pubmed.

Таким образом, скрипт должен удалить из заголовка все специальные символы, цифры и нелатинские буквы, а также слово/знак, что только что упомянутые "касания" (слова, которые не отделены от специальных знаков, букв или нелатинских букв с пространство).

Поэтому мне нужно это преобразовать, например:

Большая проводимость Ca2+ -activated K+ активация канала с NS1619 уменьшает миогенные и нейрогенные сокращения гладкой мускулатуры крысиного детрузора.

в:

Большая активация канала проводимости уменьшает миогенные и нейрогенные сокращения гладкой мускулатуры крысиного детрузора.

Другим примером является преобразование этого:

Нарушение LTP фракталкином /CX3CL1 в гиппокампе мыши опосредуется через активность аденозинового рецептора типа 3 (A3R)

в:

Нарушение LTP у мышей гиппокампа опосредуется через активность типа аденозинового рецептора

У меня уже есть:

function rename_article ($article){
 global $alphabet;
 $pos_hyphen = strpos($article, "-");
 if ($pos_hyphen===FALSE){
   $article = preg_replace ("/[^a-zA-Z0-9\s]/"," ",$article);
  for ($i = 0; $article[$i]; $i++)
  {
   $article .= !is_numeric($article[$i]) ? $article[$i] : "";
  }
  return $article;
 }
 $substr = substr($article, 0, $pos_hyphen);

 $pos1 = strrpos($substr, ' ');
 if ($pos1 === FALSE){
  $pos1 =0;
 }
 $substr2 = substr($article, $pos_hyphen, strlen($article));
 $pos2 = strpos($substr2, ' ');

 if ($pos2 === FALSE){
  $pos2 = strlen($substr2);
 }

 $length1 = $pos_hyphen-$pos1;
 $length2 = $length1+$pos2;

 $substr = substr($article,$pos1,$length2);
 if ($length1<4){
  $article = str_ireplace ($substr, '' ,$article);
  rename_article ($article);
 }
 else{
  foreach ($alphabet as $letter){
   if (strpos($substr, $letter) != FALSE){
    $article = str_ireplace ($substr, '' ,$article);
    rename_article ($article);
   }
   else{
    $article = preg_replace ("/[^a-zA-Z0-9\s]/"," ",$article);
    for ($i = 0; $article[$i]; $i++)
    {
     $article .= !is_numeric($article[$i]) ? $article[$i] : "";
    }
    return $article;
   }
  }
 }
 $article = preg_replace ("/[^a-zA-Z0-9\s]/"," ",$article);
 for ($i = 0; $article[$i]; $i++)
 {
  $article .= !is_numeric($article[$i]) ? $article[$i] : "";
 }
 return $article;
};

Но это не исключает слов, как я описал выше.

ПОМОГИ ПОЖАЛУЙСТА

  • 0
    А как насчет двухсторонних имен? Очевидно, должны существовать такие названия, как «бла-бла Тай-Сакс-бла-бла», где ваше правило лишит «Тэй-Сакса».
  • 0
    это происходит очень редко, и они нам не нужны. или другие слова, которые мы должны исключить, чтобы они работали для большинства результатов поиска
Теги:

5 ответов

0
Лучший ответ

Наверное, я бы пошла об этом немного иначе, чем вы сделали выше. Я бы сначала сломал название на слова, а затем оставил только приемлемые слова.

function rename_article( $title ) {
    $title = rtrim( $title, ".?!" );  // Added for punctuation at end of title
    $titleWords = explode( ' ', $title );
    $newTitle = '';
    foreach( $titleWords as $titleWord ) {
        if( !preg_match( '/[^a-zA-Z]/', $titleWord ) ) {
            if( empty( $newTitle ) )
                $newTitle = $titleWord;
            else
                $newTitle .= ' ' . $titleWord;
        }
    }
    return $newTitle;
}
  • 0
    Все, где нет букв, будет отклонено (т. Е. Шаблон не является az-or-AZ, и я выбираю строки, в которых нет букв, с помощью! Preg_match ()).
  • 0
    Спасибо! но это не приведет к: Большой активации K-канала проводимости с уменьшением миогенных и нейрогенных сокращений гладких мышц детрузора крысы, так что "K" все еще будет там
Показать ещё 6 комментариев
1

Простой подход для приведенных примеров:

function rename_article($article) {
    $return = "";
    $array = explode(" ",$article);
    foreach($array as $word) {
        if(preg_match("/^[a-zA-Z.]*$/",$word)) {
            $return.= " ".$word;
        }
    }
    return trim($return);
}
0

Первое, что вам нужно сделать, это определить фактическую структуру слов, которые мы удаляем, и поместить их в массив.

Очевидно, что + и - есть, и я думаю /, а также что-нибудь с цифрой? и тоже. Надеюсь, я ничего не пропустил. Тот факт, что числовые символы гарантируют дисквалификацию, означает, что если вы этого захотите, вам даже не нужно использовать унцию RegEx, вы можете просто вставить их в массив вручную.

Затем возьмите исходное предложение и взорвите его в пространстве (http://php.net/manual/en/function.explode.php)

Затем сделайте приятную прогулку и сравните значение с исходным массивом (http://php.net/manual/en/function.array-walk.php)

Если значение вашего взорванного массива не содержит каких-либо шаблонов, которые вы уже использовали, введите его в новый массив.

Поместите массив обратно (http://php.net/manual/en/function.implode.php)

trim() и наклейте период на конец, если хотите.

Вместо того, чтобы использовать все, что Regex, я лично просто strpos() http://php.net/manual/en/function.strpos.php

Надеюсь это поможет.

0

Сначала разделите заголовок пробелом, затем проверьте слово "слово", действительно ли оно или должно быть удалено?

$title = "LTP impairment by fractalkine/CX3CL1 in mouse hippocampus is 
   mediated through the activity of adenosine receptor     type 3 (A3R)";

$title_words = preg_split('/\s+/', $title);

$new_title = "";

foreach ($title_words as $word) {
  if (preg_match('/^[a-z]+$/i', $word)) {
     $new_title .= " $word";
  } 
}

$new_title =  trim($new_title);

echo $new_title;

результат

LTP impairment by in mouse hippocampus is mediated through 
the activity of adenosine receptor type
0

попробуй это

<?php
$string = "Large conductance Ca2+ -activated K+ channel activation
with NS1619 decreases myogenic and neurogenic contractions of rat detrusor smooth muscle.";

$string2 = "LTP impairment by fractalkine/CX3CL1 in mouse hippocampus is
 mediated through the activity of adenosine receptor type 3 (A3R)";


function getTitle($string){
    $s = explode(' ', $string);
    foreach($s as $key => $value){
        if(preg_match('/([a-z]+[0-9\+]|[\-]+[a-z0-9\+])|[0-9]/i', $value)){
           unset($s[$key]);
        }
    }
    return implode(' ', $s);
}

 echo getTitle($string2);
 echo getTitle($string);

вывод

LTP impairment by in mouse hippocampus is mediated through the activity of adenosine receptor type

второй

Large conductance channel activation with decreases myogenic and neurogenic contractions of rat detrusor smooth muscle.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню