2012-04-20 4 views
6

Я пытаюсь разделить предложение/фразу на слова, используя Regex.Как разбить фразу на слова с помощью Regex в C#

var phrase = "This isn't a test."; 
var words = Regex.Split(phrase, @"\W+").ToList(); 

слово содержит "This", "ISN", "T", "а", "тест"

Очевидно, что это собирание апострофа и расщепления на этом. Могу ли я изменить это поведение? Он также должен быть многоязычным, поддерживающим различные языки (испанский, французский, русский, корейский и т. Д.).

Мне нужно передать слова в проверку орфографии. В частности, Nhunspell.

return (from word in words let correct = _engine[langId].Spell(word) where !correct select word).ToList(); 
+0

разделите на пространствах вместо этого? У вас есть хороший пример прецедентов, чтобы продемонстрировать, что нужно для этого Regex? – mellamokb

+0

Я передаю слова в проверку орфографии, поэтому мне нужно потерять пунктуацию. – Dean

+0

Поскольку вы хотите разбить на несколько разных языков, вам нужно использовать токенизатор, который понимает указанные языки. В вашем примере явно не слово, а на другом языке «обычно не может быть частью слова». В большинстве библиотек проверки орфографии есть токенизатор или парсер, которые могут выполнять эту работу за вас. – jessehouwing

ответ

7

Если вы хотите разбить на слова для проверки орфографии целей, это хорошее решение:

new Regex(@"[^\p{L}]*\p{Z}[^\p{L}]*") 

В основном вы можете использовать Regex.Split, используя предыдущее регулярное выражение. Он использует синтаксис юникода, поэтому он будет работать на нескольких языках (но не для большинства азиатских). И он не сломает слова с апострофами дефисов.

4

Split().

words = phrase.Split(' '); 

Без знаков препинания.

words = phrase.Split(new Char [] {' ', ',', '.', ':', , ';', '!', '?', '\t'}); 
1

На самом деле не похоже, что вам нужно регулярное выражение. Вы могли бы просто сделать:

phrase.Split(" "); 
+0

Только если вы хотите пунктуацию в своих словах. –

1

Что вы хотите разбить? Пространства? Пунктуация? Вы должны решить, что это за символы остановки. Простым регулярным выражением, которое использует пробел и несколько знаков препинания, будет "[^.?!\s]+". Это разделило бы на период, вопросительный знак, восклицательный знак и любые символы пробелов.

+0

Мне также нужно рассмотреть испанский, который будет иметь восклицания и вопросы, которые перевернуты. – Dean

+0

Затем добавьте эти символы в список символов внутри '[]' и после '^'. Так, например, '' [^.?! ¿¡\ S] ". Вероятно, вы захотите добавить круглые скобки, запятую, точку с запятой и многие другие символы пунктуации. Этот список - это символы, которые вы * не хотите * в своих словах. «^» В начале означает «не эти символы». Поэтому вам нужно добавить символ каретки (^) в список. –

+0

Хорошо, я собираюсь посмотреть, что я могу сделать, чтобы получить список знаков препинания. Мне нравится этот подход. – Dean

1

Вы можете попробовать, если вы пытаетесь разбить только на основе пробелов.

var words = Regex.Split(phrase, @"[^ ]+").ToList(); 

Другой подход состоит в том, чтобы добавить апостроф, добавив это к вашему классу символов.

var words = Regex.Split(phrase, @"(\W|')+").ToList(); 

В противном случае существует конкретная причина, по которой вы не можете использовать string.Split()? Это казалось бы гораздо более простым. Кроме того, вы также сможете передавать другие знаки пунктуации (то есть разделять на, а также пробелы).

var words = phrase.Split(' '); 
var words = phrase.Split(new char[] {' ', '.'}); 
0

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

Это необработанные и расширенные регулярные выражения, слова находятся в группе захвата 1.
Сделайте глобальный поиск.

Unicode (doesen't счет для графема-х)

[\s\pP]* ([\pL\pN_-] (?: [\pL\pN_-] | \pP(?=[\pL\pN\pP_-]))*) 

Ascii

3

В связи с тем, что несколько языков используют очень сложные правила для сложения слов в фразы и предложения, вы не можете полагаться на простое регулярное выражение, чтобы получить все слова из фрагмента текста. Даже для того, чтобы язык был «простым», как английский, вы будете работать в нескольких случаях, таких как:

  • Как обращаться с такими словами, как вы, не там, где есть два слова и несколько символы заменяются символом '.
  • Как обращаться с аббревиатуры, такие как г-жи т.е.
  • объединенные слова, используя «-»
  • дефис слова в конце предложения.

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

Возможно, вы захотите прочитать на Text Segmentation, и если сегментация важна для вас, инвестируйте средства проверки орфографии, которые могут анализировать весь текст или механизм текстовой сегментации, который может разделить ваши предложения на слова в соответствии с правилами язык.

Я не смог найти многоязычный сегментирующий движок на основе .NET с быстрым поиском Google. Сожалею.

Смежные вопросы