2010-01-28 3 views
0

Я использую Delphi 7. Хотелось бы подсчитать количество повторений каждого слова в большом тексте (500 слов). Как я мог это сделать?Статистика слов в тексте с Delphi

+0

Звучит как домашнее задание для меня. – mj2008

+0

слишком старый для этого: p –

ответ

2

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

var 
    i : integer; 
    iCount : integer; 
    idxFound : integer; 
    someText : string; 
    s : TStringList; 
    oneWord : string; 

begin 
    someText := 'this that theother and again this that theother this is not that'; 
    oneWord := ''; 

    s := TStringList.Create; 
    for i := 1 to length(someText) do begin 
    if someText[i] = ' ' then begin 
     idxFound := s.indexof(oneWord); 
     if idxFound >= 0 then begin 
     iCount := integer(s.objects[idxFound]); 
     s.Objects[idxFound] := TObject(iCount + 1); 
     end 
     else begin 
     s.AddObject(oneWord, TObject(1)); 
     end; 
     oneWord := ''; 
    end 
    else begin 
     oneWord := oneWord + someText[i]; 
    end; 
    end; 

    if oneWord <> '' then 
    if idxFound >= 0 then begin 
     iCount := integer(s.objects[idxFound]); 
     s.Objects[idxFound] := TObject(iCount + 1); 
    end 
    else begin 
     s.AddObject(oneWord, TObject(1)); 
    end; 

    // put the results on the screen in a text box. 
    memo1.Text := ''; 
    for i := 0 to s.Count - 1 do 
    memo1.Lines.Add(intToStr(integer(s.Objects[i])) + ' ' + s[i]); 
+0

, если это отсортированный список строк, вы можете использовать «s.find» вместо «s.indexof». Кроме того, вам может потребоваться установить чувствительность к регистру списка строк, подходящую для вашей реализации. –

+0

Спасибо Дон: Это именно то, что я хочу сделать! Есть ли способ использовать другой разделитель (помимо пространства '')? –

+0

убедитесь, что просто измените строку: , если someText [i] = '', тогда начните , чтобы проверить, нет ли каких-либо разделителей (-ей) –

0

Я не помню никаких встроенных функций Delphi, которые непосредственно это делают. Но простой метод O (n * Log (n)) заключается в сортировке слов, а затем их сканировании и подсчете.

+0

Привет, Марк: не могли бы вы привести мне пример реализации? –

+0

@ mo3ez: Извините - у меня нет свободного времени прямо сейчас. Тем не менее, подсчет слов Марко является хорошим началом для разбора слов. Поместите отдельные слова в массив и отсортируйте их. Для хорошего примера сортировки см. Сообщение SO http://stackoverflow.com/questions/41733/best-way-to-sort-an-array-in-delphi. –

0

Если мы говорим о количестве слов в текстовой строке, то что вы могли бы сделать, это разобрать строку и определить слова. Добавьте слова на карту, где идентификатором является слово it self, а значение - число. Это число увеличивается, если слово, которое вы найдете в строке, уже существует на карте.

map<string, int> 
foreach word in string 
    if word is in map 
     map[word] = map[word] + 1 
    else 
     map[word] = 1 
    end if 
end for 

Поскольку я не знаю delphi, что хорошо, я попытался предоставить вам пример псевдокода.

-1

От ФФК strutils библиотеки:

function WordCount(const S: string; const WordDelims: TSysCharSet): Integer; 

var 
P,PE : PChar; 

begin 
    Result:=0; 
    P:=Pchar(pointer(S)); 
    PE:=P+Length(S); 
    while (P<PE) do 
    begin 
    while (P<PE) and (P^ in WordDelims) do 
     Inc(P); 
    if (P<PE) then 
     inc(Result); 
    while (P<PE) and not (P^ in WordDelims) do 
     inc(P); 
    end; 
end; 

WordCount (тест, [ ' '!? '','', '', '', # 10, # 13]); будет хорошей первой попыткой. Он предназначен для простых вычислений по величине, поскольку он, например, не заботится о сокращенных словах.

Конечно, если вы передадите это как домашнее задание, вас, вероятно, попросят объяснить его работу.

+1

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

+0

Спасибо, Марко. Для чего нужен второй параметр? Как я могу перечислить все «уникальные» слова текста, а затем передать их один за другим в функцию, чтобы получить необходимую мне статистику (вхождения в слово). –

0

a TSTringList также может использоваться для «списка слов». Пропустите все ваши слова и добавьте всех и каждого в tStringlist в качестве нового элемента. Когда вы закончите, у вас есть счет TOTAL, чтобы определить уникальные слова, отсортировать список и в цикле увидеть, отличается ли текущее слово от предыдущего ... если это так, то увеличивайте количество уникальных слов.

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