Dzielenie łańcucha tekstowego na słowa


Tematy pokrewne
Łańcuchy znakowe
Podstawowe pojęcia dotyczące przetwarzania tekstów
Podstawowe operacje na łańcuchach znakowych
Naiwne wyszukiwanie wzorca w tekście
Wyszukiwanie maksymalnego prefikso-sufiksu
Szybkie wyszukiwanie wzorca algorytmem Morrisa-Pratta
Szybkie wyszukiwanie wzorca algorytmem Knutha-Morrisa-Pratta
Szybkie wyszukiwanie wzorca uproszczonym algorytmem Boyera-Moore'a
Szybkie wyszukiwanie wzorca pełnym algorytmem Boyera-Moore'a
Wyszukiwanie wzorca algorytmem Karpa-Rabina
Zliczanie słów w łańcuchu
Dzielenie łańcucha na słowa
Wyszukiwanie najdłuższego słowa w łańcuchu
Wyszukiwanie najdłuższego wspólnego podłańcucha
Wyszukiwanie najdłuższego wspólnego podciągu
Wyszukiwanie najkrótszego wspólnego nadłańcucha
Wyszukiwanie słów podwójnych
Wyszukiwanie palindromów
MasterMind – komputer kontra człowiek
MasterMind – człowiek kontra komputer
Szyfr Cezara
Szyfrowanie z pseudolosowym odstępem
Szyfry przestawieniowe
Szyfr Enigmy
Szyfrowanie RSA
Dodawanie dużych liczb
Mnożenie dużych liczb
Potęgowanie dużych liczb
Duże liczby Fibonacciego
Haszowanie
Podstawowe operacje na tablicach
Wyszukiwanie liniowe
Wyszukiwanie liniowe z wartownikiem

 

Problem

Podzielić dany łańcuch tekstowy s na zawarte w nim słowa.


Operacja podziału łańcucha znaków na zawarte w nim słowa (ang. splitting into words) jest często wykonywana jako wstęp do różnych algorytmów tekstowych.

W naszym prostym algorytmie w pętli będą wydobywane kolejne słowa z łańcucha s. Słowa te mogą być następnie odpowiednio przetworzone przez inny algorytm. Zasada pracy jest następująca:

 

Tworzymy pusty łańcuch ss, w którym będą gromadzone znaki wydobywanego słowa. Na końcu łańcucha s umieszczamy wartownika – dowolny znak nie będący literą ani cyfrą – może to być np. spacja. Wartownik zagwarantuje nam przetworzenie wszystkich słów łańcucha s. Następnie przeglądamy kolejne znaki łańcucha s. Jeśli przeglądany znak jest literą lub cyfrą, to dołączamy go do łańcucha ss. W przeciwnym razie, jeśli łańcuch ss zawiera znaki, przetwarzamy je jako słowo, po czym łańcuch ss zerujemy – będzie on gotowy na przyjęcie nowych znaków dla kolejnego słowa.

 

Algorytm podziału łańcucha na słowa

Wejście:
s – łańcuch tekstowy.
Wyjście:

kolejne słowa zawarte w łańcuchu s.

Elementy pomocnicze:
i    indeks znaków w łańcuchu s, i N
ss  – łańcuch zawierający kolejne słowa z łańcucha s
Lista kroków:
K01: ss ← "" ; zerujemy łańcuch słowa
K02: ss + wartownik ; na końcu łańcucha s umieszczamy wartownika
K03: Dla i = 0,1,...,|s| - 1 wykonuj K04...K09 ; przeglądamy kolejne znaki łańcucha s
K04:     Jeśli s[i] = cyfra_lub_litera, to idź do K09 ; litery i cyfry dołączamy do łańcucha ss
K05:     Jeśli ss = "", to następny obieg pętli K03 ; sprawdzamy, czy ss zawiera jakieś słowo
K06:     Przetwarzaj ss ; przetwarzamy wydobyte słowo
K07:     ss ← "" ; zerujemy ss dla następnego słowa
K08:     Następny obieg pętli K03  
K09:     ssss + s[i] ; dołączamy znak s[i] do łańcucha ss
K10: Zakończ  

 

Program

Ważne:

Zanim uruchomisz program, przeczytaj wstęp do tego artykułu, w którym wyjaśniamy funkcje tych programów oraz sposób korzystania z nich.

 

Program odczytuje wiersz znaków i wypisuje zawarte w nim słowa w klamerkach.

 

Lazarus
// Podział łańcucha tekstowego na słowa
// Data:  6.07.2008
// (C)2012 mgr Jerzy Wałaszek
//-----------------------------

program prg;

var
  s,ss : ansistring;
  i : integer;

begin
  readln(s);
  ss := '';
  s := s + ' '; // dodajemy wartownika
  for i := 1 to length(s) do
    if s[i] in ['0'..'9','_','-',
                'A'..'Z','a'..'z',
                'Ą','ą','Ć','ć','Ę','ę',
                'Ł','ł','Ń','ń','Ó','ó',
                'Ś','ś','Ź','ź','Ż','ż'] then
      ss := ss + s[i]
    else if ss <> '' then
    begin
      writeln('[',ss,']'); ss := '';
    end;
  writeln;
end.
Code::Blocks
// Podział łańcucha tekstowego na słowa
// Data:  6.07.2008
// (C)2012 mgr Jerzy Wałaszek
//-----------------------------

#include <iostream>
#include <string>

using namespace std;

int main()
{
  string s,ss;
  int i,n;
  unsigned char c;

  getline(cin,s);
  ss = "";
  s += " "; // dodajemy wartownika
  n = s.length();
  for(i = 0; i < n; i++)
  {
    c = s[i];
    if(((c >= '0') && (c <= '9')) || (c == '_') || (c == '-')  ||
       ((c >= 'A') && (c <= 'Z')) ||((c >= 'a') && (c <= 'z')) ||
        (c == 164) || (c == 165)  || (c == 143) || (c == 134)  ||
        (c == 168) || (c == 169)  || (c == 157) || (c == 136)  ||
        (c == 227) || (c == 228)  || (c == 224) || (c == 162)  ||
        (c == 151) || (c == 152)  || (c == 141) || (c == 171)  ||
        (c == 189) || (c == 190))
      ss += c;
    else if(ss != "")
    {
      cout << "[" << ss << "]\n";
      ss = "";
    }
  }
  return 0;
}
Free Basic
' Podział łańcucha tekstowego na słowa
' Data:  6.07.2008
' (C)2012 mgr Jerzy Wałaszek
'-----------------------------

Dim As String s,ss
Dim As Uinteger i,n,c

Line Input s
ss = ""
s += " " 'dodajemy wartownika
n = Len(s)
For i = 1 To n
  c = Asc(Mid(s,i,1))
  If(((c >= Asc("0")) And (c <= Asc("9"))) Or (c = Asc("_"))  Or  (c = Asc("-"))    Or _
     ((c >= Asc("A")) And (c <= Asc("Z"))) Or((c >= Asc("a")) And (c <= Asc("z")))  Or _
      (c = 164) Or (c = 165)  Or (c = 143) Or (c = 134)  Or (c = 168) Or (c = 169)  Or _
      (c = 157) Or (c = 136)  Or (c = 227) Or (c = 228)  Or (c = 224) Or (c = 162)  Or _
      (c = 151) Or (c = 152)  Or (c = 141) Or (c = 171)  Or (c = 189) Or (c = 190)) Then
    ss += Chr(c)
  Elseif ss <> "" Then
    Print "[";ss;"]"
    ss = ""
  End If
Next
Print
End
Wynik
Człowiek nie lubi pracować, bo i po co miałby to robić?
[Człowiek]
[nie]
[lubi]
[pracować]
[bo]
[i]
[po]
[co]
[miałby]
[to]
[robić]

 

Podział łańcucha tekstowego na słowa
(C)2012 mgr Jerzy Wałaszek
Wprowadź tekst:


...

 



List do administratora Serwisu Edukacyjnego Nauczycieli I LO

Twój email: (jeśli chcesz otrzymać odpowiedź)
Temat:
Uwaga: ← tutaj wpisz wyraz  ilo , inaczej list zostanie zignorowany

Poniżej wpisz swoje uwagi lub pytania dotyczące tego rozdziału (max. 2048 znaków).

Liczba znaków do wykorzystania: 2048

 

W związku z dużą liczbą listów do naszego serwisu edukacyjnego nie będziemy udzielać odpowiedzi na prośby rozwiązywania zadań, pisania programów zaliczeniowych, przesyłania materiałów czy też tłumaczenia zagadnień szeroko opisywanych w podręcznikach.



   I Liceum Ogólnokształcące   
im. Kazimierza Brodzińskiego
w Tarnowie

©2017 mgr Jerzy Wałaszek

Dokument ten rozpowszechniany jest zgodnie z zasadami licencji
GNU Free Documentation License.