Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.10.2012, 09:15   #1
just4question
Новичок
Джуниор
 
Регистрация: 08.10.2012
Сообщений: 1
Сообщение Подсчет вероятности встречи в тексте двухсимвольных сочетаний

Попросили помочь, а так как сам в программировании не силен, решил спросить совета
Задача - считать из файла текст и подсчитать вероятность встречи двухсимвольных сочетаний (Например в тексте "Мама мыла раму" - "ма" - 2 раза, "мы" - 1 раз и т.д.). Как видится алгоритм:
1) считываем текстовый файл в переменную
2) пробегаем по тексту и удаляем проблемы, знаки препинания, буквы вроде "ъ" и т.д. (условие есть в задании)
3) полученный блок запихиваем в массив в виде $array[ма]=2, где "ма" - сочетание букв, "2" - сколько раз встретилось в тексте.
4) На основе количества элементов массива и вероятности их встречи считаем процентные соотношения.

Собственно вопросы
а) пока вижу пункт 3 только как "взять след 2 символа, проверить массив, есть ли в нем такой элемент, если нет - добавить, если да - увеличить счетчик". Может есть более изящные варианты?
б) к реализации программы нет никаких требований, поэтому посоветуйте пожалуйста язык, где есть средства/встроенные функции для подобного Сам присматриваюсь к perl или php, они вроде много всего имеют для работы с текстом, а о каком языке читать мне разницы нет

Заранее спасибо.
just4question вне форума Ответить с цитированием
Старый 09.10.2012, 20:54   #2
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
а о каком языке читать мне разницы нет
ты мне нравишься )
на прологе держи: (программа выводит количество вхождения каждой пары символов в СТРОКЕ (без учета регистров и пропуска пробельных символов).
Код:
predicates
	p(string)
	p1( string )
	out
database
	f(string,integer)
goal
	S = "Мама мыла раму", retractall(f(_,_)),!,
	write( S ), nl, p( S ), out.
clauses
	p( S ):-
		frontchar( S, C1, S1 ),
		frontchar( S1, C2, _ ),
		frontchar( P1, C2, "" ), 
		frontchar( P, C1, P1 ),!,
		p1( P ), p( S1 ).
	p( _ ):-!.
	p1( P ):-
		retract( f( P, N ) ),!, N1 = N + 1,
		assert( f( P, N1 ) ).
	p1( P ):-
		assert( f( P, 1 ) ).
	out:-
		retract( f( S, N ) ),!,
		write( S, "->", N ),nl,out.
	out.
Для ввода с файла замени:
S = "Мама мыла раму" на file_str("input.txt",S)
Осталось поискать в интернетах как установить всем символам один регистр ( думаю первой ссылки по "регистр символов prolog" будет достаточно, хотя....в какой кодировке файл? )

и чуть не забыл, удаление пробельных символов тоже есть в интернетах, но накидаю ( не проверял )
Код:
space("\n").
space("\t").
space(" ").
%....
rm("","").
rm(S,R):-
	frontchar(S,C,S1),NOT(space(C)),!,rm(S1,R1),frontchar(R,C,R1);
	frontchar(S,_,S1),rm(S1,R).

Последний раз редактировалось Stilet; 09.10.2012 в 21:41.
rrrFer вне форума Ответить с цитированием
Старый 10.10.2012, 13:05   #3
bormot
 
Регистрация: 10.10.2012
Сообщений: 9
По умолчанию

Цитата:
Сообщение от just4question Посмотреть сообщение
Попросили помочь, а так как сам в программировании не силен, решил спросить совета
Задача - считать из файла текст и подсчитать вероятность встречи двухсимвольных сочетаний (Например в тексте "Мама мыла раму" - "ма" - 2 раза, "мы" - 1 раз и т.д.). Как видится алгоритм:
1) считываем текстовый файл в переменную
2) пробегаем по тексту и удаляем проблемы, знаки препинания, буквы вроде "ъ" и т.д. (условие есть в задании)
3) полученный блок запихиваем в массив в виде $array[ма]=2, где "ма" - сочетание букв, "2" - сколько раз встретилось в тексте.
4) На основе количества элементов массива и вероятности их встречи считаем процентные соотношения.

Собственно вопросы
а) пока вижу пункт 3 только как "взять след 2 символа, проверить массив, есть ли в нем такой элемент, если нет - добавить, если да - увеличить счетчик". Может есть более изящные варианты?
б) к реализации программы нет никаких требований, поэтому посоветуйте пожалуйста язык, где есть средства/встроенные функции для подобного Сам присматриваюсь к perl или php, они вроде много всего имеют для работы с текстом, а о каком языке читать мне разницы нет

Заранее спасибо.
Нельзя удалять пробелы
Лучший язык доля работы со строками бейсик
Берете два символа поочередно и проверяете в цикле текст на совпадение

Цитата:
Сообщение от rrrFer Посмотреть сообщение
ты мне нравишься )
на прологе держи: (программа выводит количество вхождения каждой пары символов в СТРОКЕ (без учета регистров и пропуска пробельных символов).
А зачем Пролог?
Чтобы выпендрится ?

Последний раз редактировалось Stilet; 10.10.2012 в 14:38.
bormot вне форума Ответить с цитированием
Старый 10.10.2012, 14:05   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

С "удалением" всех лишних символов (т.е. "мамамылараму") на Delphi:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;


const
  alp = 'АБВГДЕЁЖЗИЙКЛМНПОРСТУФХЦЧШЩЪЫЬЭЮЯ';

var
  Form1: TForm1;
  str: string;
  a: array[1..length(alp), 1..length(alp)] of integer;
  buf: string[2];
  i, j, count: integer;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  FillChar(a, SizeOf(a), 0);
  str := memo1.Text;
  memo1.Clear;
  str := AnsiUpperCase(str);
  buf := '';
  i := 1;
  count := 0;
  while (2 > length(buf)) and (i <= length(str)) do
  begin
    if pos(str[i], alp) > 0 then
      buf := buf + str[i];
    inc(i);
  end;
  //memo1.lines.Append(buf);
  if length(buf) = 2 then
  begin
    inc(a[pos(buf[1], alp), pos(buf[2], alp)]);
    inc(count);
  end;
  while i <= length(str) do
  begin
    if pos(str[i], alp) > 0 then
    begin
      buf[1] := buf[2];
      buf[2] := str[i];
      if a[pos(buf[1], alp), pos(buf[2], alp)] = 0 then
        inc(count);
      inc(a[pos(buf[1], alp), pos(buf[2], alp)]);
      //memo1.lines.Append(buf);
    end;
    inc(i);
  end;
  memo1.Lines.Append('count = ' + inttostr(count));
  if count > 0 then
    for i := 1 to length(alp) do
      for j := 1 to length(alp) do
        if a[i, j] <> 0 then
          memo1.Lines.append(alp[i] + alp[j] + ' ' +
            inttostr(a[i, j]) + ' ' + floattostr(100 * a[i, j] / count) + '%');
end;

end.
Без удаления символов:
Код:
procedure TForm1.Button1Click(Sender: TObject); //без удаления символов
begin
  FillChar(a, SizeOf(a), 0);
  str := memo1.Text;
  str := AnsiUpperCase(str);
  buf := '';
  i := 1;
  count := 0;
  for i := 1 to length(str) do
    if pos(str[i], alp) > 0 then
    begin
      buf := buf + str[i];
      if length(buf) = 2 then
      begin
        if a[pos(buf[1], alp), pos(buf[2], alp)] = 0 then
          inc(count);
        inc(a[pos(buf[1], alp), pos(buf[2], alp)]);
        buf := buf[2];
      end;
    end
    else
      buf := '';
  memo1.Lines.Append('count = ' + inttostr(count));
  if count > 0 then
    for i := 1 to length(alp) do
      for j := 1 to length(alp) do
        if a[i, j] <> 0 then
          memo1.Lines.append(alp[i] + alp[j] + ' {' +
            inttostr(a[i, j]) + '} ' + floattostr(100 * a[i, j] / count) + '%');
end;
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 10.10.2012 в 14:16.
BDA вне форума Ответить с цитированием
Старый 10.10.2012, 14:40   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Лучший язык доля работы со строками бейсик
Не правда.
Цитата:
А зачем Пролог?
Чтобы выпендрится ?
Читай топ внимательно:
Цитата:
к реализации программы нет никаких требований, поэтому посоветуйте пожалуйста язык
Я с таким же успехом могу предложить решение на C# или регулярными выражениями на любом ЯВУ, поддерживающем их.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.10.2012, 18:06   #6
bormot
 
Регистрация: 10.10.2012
Сообщений: 9
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Не правда.
Моя логика
Действительно NET дает одинаковые возможности разным языкам
Но бэйсик короче и удобочитальнее
Цитата:
Читай топ внимательно:
Я с таким же успехом могу предложить решение на C# или регулярными выражениями на любом ЯВУ, поддерживающем их
Не программист просит решить задачу на любом языке для друга
Обычно ему дают решение на псевдокоде или на наиболее распространенном языке
Пролог появился от желания извратится
bormot вне форума Ответить с цитированием
Старый 10.10.2012, 19:01   #7
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
Лучший язык доля работы со строками бейсик
ИМХО пролог удобнее.
Цитата:
Моя логика
Действительно NET дает одинаковые возможности разным языкам
Но бэйсик короче и удобочитальнее
не вижу логики. Вижу не аргументированные утверждения, по форме претендующие на "абсолютную истину", но ни содержания, ни логики нет.

ТС попросил помочь - мы помогли, не нравится - помоги лучше.

Сводить тему в холивары и оффтоп не стоит. Чтобы сказать что язык "лучше" надо формализовать это понятие и предложить критерии. С критерием "короче" не согласится большинство(см. брэинфак), "удобочитальнее" - субъективно, но бэйсик, в головах большинства, явно проигрывает подавляющему числу языков по этому критерию (широко распространено мнение что бэйсик делает людей инвалидами {хотя..ИМХО это не так - я проверял в детстве}).

Ну а если не можешь выразить адекватные критерии и провести нормальный анализ - ИМХО не стоит кидаться такими утверждениями (если не хочешь "выпендрится"{орфография сохранена}). "О чем нельзя говорить ясно - о том стоит молчать" (с) Витгенштейн.

Вопрос о "лучше языке" обсуждается уже много лет в соседнем разделе, там тебя уже ждет армия троллей.
rrrFer вне форума Ответить с цитированием
Старый 10.10.2012, 21:54   #8
bormot
 
Регистрация: 10.10.2012
Сообщений: 9
По умолчанию

Цитата:
Сообщение от rrrFer Посмотреть сообщение
ИМХО пролог удобнее.

не вижу логики. Вижу не аргументированные утверждения, по форме претендующие на "абсолютную истину", но ни содержания, ни логики нет.

ТС попросил помочь - мы помогли, не нравится - помоги лучше.

Сводить тему в холивары и оффтоп не стоит. Чтобы сказать что язык "лучше" надо формализовать это понятие и предложить критерии. С критерием "короче" не согласится большинство(см. брэинфак), "удобочитальнее" - субъективно, но бэйсик, в головах большинства, явно проигрывает подавляющему числу языков по этому критерию (широко распространено мнение что бэйсик делает людей инвалидами {хотя..ИМХО это не так - я проверял в детстве}).

Ну а если не можешь выразить адекватные критерии и провести нормальный анализ - ИМХО не стоит кидаться такими утверждениями (если не хочешь "выпендрится"{орфография сохранена}). "О чем нельзя говорить ясно - о том стоит молчать" (с) Витгенштейн.

Вопрос о "лучше языке" обсуждается уже много лет в соседнем разделе, там тебя уже ждет армия троллей.
Программа на брэйнфаке никак не может быть короче
Я остаюсь при своем мнении, что наиболее доступный язык лучший вариант, даже, если он уступает Прологу
Но согласен, что правильнее привести альтернативу, чем спорить о том, как надо решать задачу
На будущее учту
bormot вне форума Ответить с цитированием
Старый 23.11.2012, 03:39   #9
Sasha_Smirnov
Особый статус
Участник клуба
 
Аватар для Sasha_Smirnov
 
Регистрация: 24.11.2008
Сообщений: 1,535
По умолчанию В защиту бэйсика: доступно всем друзьям!

В документе разрешаете доступ к VBA-содержимому либо просто переносите код (по Alt-F11) в свой заброшенный Word.

Замечу, что здесь вычисляется не вероятность где-то встретить тот или иной «слог» — а его абсолютная частота в конкретном тексте документа.
Вложения
Тип файла: doc папа-мама.doc (75.0 Кб, 17 просмотров)
Sasha_Smirnov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перебор сочетаний Orjanruusu PHP 2 12.05.2012 11:42
подсчет символов в тексте(С#) Vovchik123 Помощь студентам 2 13.04.2012 18:41
Найти количество сочетаний из n по k и вывести все комбинации этих сочетаний на экран Рон99 Паскаль, Turbo Pascal, PascalABC.NET 2 14.12.2011 00:05
подсчет символов и слов в тексте(паскаль) Noven'kii Помощь студентам 4 16.05.2009 10:10