Использование PHP для удаления знаков препинания из строки, но не в рамках сокращений - PullRequest
0 голосов
/ 22 мая 2019

Я пишу код, который разбивает текст на слова и выполняет такие вещи, как подсчет размеров слов и т. Д.

Я придумал это (после некоторого поиска):

$text = preg_replace("/[^[:alnum:][:space:]]/u", ' ', $text);
$words = mb_split( ' +', $text );

Однако сокращения не работают, потому что апострофы и одинарные кавычки выглядят одинаково (потому что они есть).

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

Несмотря на то, что я опубликовал свое собственное неуверенное решение, я оставляю этот вопрос открытым в надежде найти более совершенный ответ.

Ответы [ 2 ]

1 голос
/ 23 мая 2019

Найден лучший способ, используя границы слов и символы, разрешенные в словах, вы можете напрямую посчитать слова:

<?php

$text = "One morning, when Gregor Samsa woke from troubled dreams, 
he found himself transformed in his bed into a horrible vermin. 
'He lay on his armour-like back', and if he lifted his head a 
little he could see his brown belly, slightly domed and divided by arches
into stiff sections. The bedding was hardly able to cover it and 
seemed ready to slide off any moment. His many legs, pitifully thin 
compared with the size of the rest of him, waved about helplessly as he 
looked. \"What's happened to me?\" he thought. It wasn't a dream. His 
room, a proper human room although a little too small, lay peacefully
between its four familiar walls. A collection of textile samples lay 
spread out on the table - Samsa was a travelling salesman - and 
above it there hung a picture that he had recently cut out of an 
illustrated magazine and housed in a nice, gilded frame. It showed 
a lady fitted out with a fur hat and fur boa who sat upright, 
raising a heavy fur muff that covered the whole of her lower arm 
towards the viewer. Gregor then turned to look out the window at the 
dull weather";

preg_match_all("/\b[\w'-]+\b/", $text, $words);
print_r(count($words[0]));

Примечание: Я позволил - с ' существовать внутри слова. Как «броня» будет считаться одним словом.

Regex Test: regexr.com / 4ego6

0 голосов
/ 23 мая 2019

Я работал над этим некоторое время. Комментарии и удивительно эффективное решение Таха Паксу помогли мне разобраться в проблеме. Решение Таха Паксу чисто изолировало слова, за исключением случаев, когда речь шла об акцентированных буквах. Похоже, поиск в Google подсказывает, что RegEx не так дружелюбен с не-ascii символами.

Именно тогда, когда я бросил пытаться делать регулярные выражения вуду (любой, кто может, я глубоко уважаю), я придумал этот не очень элегантный хак.

$text = "Testing text. Café is spelled true. And pokémon too... ‘bad quotes’. (brackets)... Löwen, Bären, Vögel und Käfer sind Tiere. That’s what I said.";
$text = str_replace(array('’',"'"), '000AP000', $text);
$text = str_replace("-", '000HY000', $text);
$text = preg_replace("/[^[:alnum:][:space:]]/u", ' ', $text);
$text = str_replace('000AP000', "'", $text);
$text = str_replace('000HY000', "-", $text);
$text = str_replace(array("' ",'- ','  '," '",' -','  '), ' ', $text);
$words = mb_split( ' +', $text );

Он использует две статистически маловероятные строки в качестве заполнителей, очищает остальные, отбрасывает дефисы и апострофы, а затем удаляет все, что касается пробелов (и нескольких пробелов). Это работает для всего, что я могу найти, чтобы бросить на это.

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

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