2010-09-09 13 views
6

Possible en double:
PHP - How to split a paragraph into sentences.Expression régulière pour le comptage des phrases dans un bloc de texte

J'ai un bloc de texte que je voudrais séparer en phrases, quelle serait la meilleur moyen de le faire? J'ai pensé à chercher '.', '!', '?' personnages, mais je me suis rendu compte qu'il y avait quelques problèmes avec cela, comme lorsque les gens utilisent des acronymes, ou terminer une phrase avec quelque chose comme!?. Quelle serait la meilleure façon de gérer cela? Je me suis dit qu'il y aurait quelques regex qui pourraient gérer cela, mais je suis ouvert à une solution non-regex si cela correspond mieux au problème.

Répondre

2

Regex n'est pas la meilleure solution pour ce problème. Vous seriez mieux servi en créant une bibliothèque d'analyse. Quelque chose où vous créez facilement des blocs de logique pour distinguer une chose d'une autre. Vous devrez créer un ensemble de règles qui diviseront le texte en segments que vous aimeriez voir.

"Are you sure?" he asked. 

ne pas que gâcher les choses lors de l'utilisation regex? Cependant, avec un analyseur, vous pouvez effectivement voir

<start quote><capitalization>are you sure<question><end quote>he asked<period> 

avec des règles simples pourrait dire "c'est une phrase."

+1

Ou, agaçant, vous pourriez obtenir des choses comme «Êtes-vous sûr»? il a demandé. »qui sont sémantiquement correctes mais regardez oh si mal. De plus, les noms contenant de la ponctuation sont également mauvais: «Lequel? recommande d'acheter .... ' –

+0

En fait le? devrait être à l'intérieur des citations. –

1

Malheureusement, il n'y a pas de solution parfaite pour cela, pour les raisons que vous avez indiquées. Si c'est le contenu que vous pouvez en quelque sorte contrôler ou forcer un délimiteur spécifié après chaque phrase, ce serait idéal. Au-delà de cela, tout ce que vous pouvez vraiment faire est de chercher (\.|!|?)+ et peut-être même jeter un \ s après que la plupart des gens pad de nouvelles phrases avec 1 ou 2 espaces entre la phrase précédente et suivante.

0

Je pense que le plus gros problème est l'existence possible d'acronymes! Par conséquent, vous devez utiliser quelque chose comme Prof.&nbsp;Knuth dans une phrase récapitulative JavaDoc afin que le générateur javadoc ne pense pas que la première phrase se termine après Prof.. Ceci est un problème que je ne sais pas comment quelqu'un peut gérer de manière fiable. La seule solution approximative que je puisse imaginer est l'utilisation d'un dictionnaire d'abréviations.

+0

Il n'y a pas d'acronymes (les mots formés à partir des initiales d'autres mots, à savoir ASAP) dans votre exemple, seulement une abréviation (un mot représenté par un sous-ensemble principal des lettres habituelles). – dmckee