2012-04-20 8 views
6

Próbuję podzielić zdanie/wyrażenie na słowa za pomocą Regex.Jak podzielić frazę na słowa za pomocą Regex w C#

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

zawiera słowa "to", "ISN", "T", "a", "test"

Oczywiście to podniesienie apostrof i podział na ten temat. Czy mogę zmienić to zachowanie? Musi również być wielojęzyczny, obsługujący różne języki (hiszpański, francuski, rosyjski, koreański, itp.).

Muszę przekazać słowa do sprawdzania pisowni. W szczególności Nhunspell.

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

Zamiast tego spróbuj podzielić na spacje? Czy masz dobrą próbkę przypadków użycia, aby zademonstrować, co Regex musi obsłużyć? – mellamokb

+0

Podaję słowa do sprawdzania pisowni, więc muszę stracić interpunkcja. – Dean

+0

Ponieważ chcesz podzielić na kilka różnych języków, musisz użyć tokenizera, który rozumie wymienione języki. W twoim przykładzie nie jest to jednoznacznie słowo, ale w innym języku "normalnie może nie być częścią słowa". Większość bibliotek do sprawdzania pisowni ma tokenizer lub parser, który może wykonać tę pracę za ciebie. – jessehouwing

Odpowiedz

7

Jeśli chcesz podzielić się na słowach do sprawdzania pisowni celów, to jest to dobre rozwiązanie:

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

Zasadniczo można użyć Regex.Split przy użyciu poprzedniego wyrażenia regularnego. Używa składni Unicode, więc działałoby w kilku językach (nie dla większości azjatyckich). I nie będzie łamać słów z apostrofami dla myślników.

4

Użyj Split().

words = phrase.Split(' '); 

Bez interpunkcji.

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

To naprawdę nie wydaje się, że potrzebujesz wyrażeń regularnych. Możesz po prostu zrobić:

phrase.Split(" "); 
+0

Tylko jeśli chcesz interpunkcji w słowach. –

1

Na czym chcesz się podzielić? Spaces? Interpunkcja? Musisz zdecydować, jakie są znaki stopu. Proste wyrażenie, które używa spacji i kilku znaków interpunkcyjnych, byłoby "[^.?!\s]+". Podział na okres, znak zapytania, wykrzyknik i wszelkie znaki odstępu.

+0

Muszę również rozważyć hiszpański, który będzie miał wykrzykniki i pytania do góry nogami. – Dean

+0

Następnie dodaj te znaki do listy znaków wewnątrz '[]' i po '^'. Tak więc na przykład '" [^.?! À ¡\ s] "'. Prawdopodobnie będziesz chciał dodać nawiasy, przecinki, średniki i wiele innych znaków interpunkcyjnych. Ta lista to znaki, których nie chcesz * w swoich słowach. "^" Na początku oznacza "nie te znaki". Będziesz więc musiał dodać także znak caret (^) do listy. –

+0

Ok, zobaczę, co mogę zrobić, aby uzyskać listę interpunkcji. Podoba mi się to podejście. – Dean

1

Możesz spróbować, jeśli chcesz podzielić tylko na podstawie spacji.

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

Innym podejściem jest dodanie apostrofu poprzez dodanie go do swojej klasy postaci.

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

W przeciwnym razie istnieje konkretny powód, dla którego nie można użyć metody string.Split()? Wydawałoby się to znacznie prostsze. Ponadto można również przekazywać inne znaki interpunkcyjne (tj. Podzielić na., A także spacje).

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

Nie jestem osobą, java, ale można spróbować wykluczyć interpunkcyjnych podczas łupania na
pomieszczeń jednocześnie. Może coś takiego.

Są to nieprzetworzone i rozwinięte wyrażenia, słowa są w grupie przechwytywania 1.
Wykonaj wyszukiwanie globalne.

Unicode (doesen't konto dla grafem użytkownika)

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

ASCII

3

Z uwagi na to, że wiele języków używa bardzo złożonych reguł do ciągłego łączenia słów w frazy i zdania, nie można polegać na zwykłym wyraże regularnym, aby uzyskać wszystkie słowa z fragmentu tekstu. Nawet na języku jako „prosty”, jak po angielsku będzie prowadzony w wielu przypadkach narożnych, takich jak:

  • Jak obsługiwać słowa jak jesteś, nie ma gdzie tam dwa słowa łączone i szereg znaki zastępuje się ".
  • Sposób postępowania skróty, takie jak Pan Pani tj
  • połączone za pomocą słowa „-”
  • sprzężone słów na końcu zdania.

Chińskie i japońskie (między innymi) są bardzo trudne do przeanalizowania w ten sposób, ponieważ te języki nie używają spacji między wyrazami, tylko między zdaniami.

Możesz przeczytać na Text Segmentation i jeśli segmentacja jest dla Ciebie ważna, zainwestuj w moduł sprawdzania pisowni, który może parsować cały tekst lub mechanizm segmentacji tekstu, który może podzielić zdania na słowa zgodnie z regułami język.

Nie mogłem znaleźć wielojęzycznego mechanizmu segmentacji opartego na .NET z szybkim wyszukiwaniem w Google. Przepraszam.

Powiązane problemy