Модераторы: korob2001, ginnie

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> сравнение файлов, странный результат 
:(
    Опции темы
LisaST
Дата 13.1.2007, 02:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 8.4.2006
Где: Munich

Репутация: нет
Всего: нет



мне нужно сравнить два текстовых файла (каждый 1мил. слов), но я пока тестирую на небольшом кол-ве. Где моя ошибка, выдает мне $counter=1100 при сранении файлов, где только 2 слова одинаковы,надо, чтобы выдавало общее кол-во одинаковых слов, а не рез-т для каждой строки 

пробовала также с if ( index($zeile,$suche) > -1 ) вместо $zeile eq $suche

спасибо за помощь


Код

#!/usr/bin/perl -w

use strict;
open(DATEI_1, "perltest1.txt") || die "Datei nicht geoeffnet, weil: $!";
my @suchen = <DATEI_1>;
chomp(@suchen);
close(DATEI_1);

open(DATEI_2, "perltest.txt") || die "Datei nicht geoeffnet, weil: $!";
while (<DATEI_2>)

   my $zeile = $_;
   my $counter = 0;
   foreach (@suchen)
   {
      my $suche = $_;
      if ( $zeile eq $suche )
      { 
        $counter++;
        
      }
     
   }
    print "$counter";
}


Это сообщение отредактировал(а) LisaST - 13.1.2007, 11:11
PM MAIL   Вверх
amg
Дата 13.1.2007, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 38
Всего: 50



LisaST, Ваша программа напечатала на самом деле не число 1100, а четыре раза по одной цифре, означающих, что первые две строки файла perltest.txt присутствуют в perltest1.txt, а следующие две - нет. Хотя весьма странно, как так смогло получиться, учитывая, что над строками второго файла был chomp, а над строками первого - нет: все строки должны были бы отличаться (за исключением, может быть, последней).

И еще не понятно, что в Вашем понимании означает "сравнить файлы".
Например, следующая программа подсчитывает кол-во строк файла perltest.txt, присутствующих в perltest1.txt.
Код

use strict;
open(DATEI_1, "perltest1.txt") || die "Datei nicht geoeffnet, weil: $!";
my %suchen = map {$_ => 1} <DATEI_1>;
close(DATEI_1);

my $counter = 0;
open(DATEI_2, "perltest.txt") || die "Datei nicht geoeffnet, weil: $!";
while (<DATEI_2>) { 
 $counter++ if exists $suchen{$_};
}
close(DATEI_2);
print "$counter\n";
Это не то, что нужно?

Это сообщение отредактировал(а) amg - 13.1.2007, 11:59
PM MAIL   Вверх
LisaST
Дата 13.1.2007, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 8.4.2006
Где: Munich

Репутация: нет
Всего: нет



спасибо за ответ, да я потом поняла, что обозначают цифры 1 и 0. задача у меня сравнить какие слова из файла 1 встречаются в файле 2 и подсчитать их кол-во (в файле 1 на строке может быть предожение или одно слово, а в файле 2 на каждой строке одно слово). первоначально идея была представить файл 1 как array и сравнивать его каждый элемент с каждой строкой в файле 2, но у меня все висло,т.к. я пыталась тестировать на 1 мил слов, потом потестировала на маленьком файле, но выдает то, что в моем первом посте вместо всего кол-ва одинаковых слов

сейчас попробую ваш вариант
PM MAIL   Вверх
Nab
Дата 13.1.2007, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 582
Регистрация: 25.3.2006
Где: Kiev

Репутация: 26
Всего: 37



Думаю в вашем случае нужно как раз наоборот...

Второй список загоняем в массив, и сортируем его, для скорости поиска.

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

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

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

#!/usr/bin/perl -w

use strict;

my %sort_list = ();
open(DATEI_2, "perltest.txt") || die "Datei nicht geoeffnet, weil: $!";
while (<DATEI_2>){ 
    # кстати это исключит повторяющиеся слова
    $sort_list{chomp}++;
}
close(DATEI_2);

open(DATEI_1, "perltest1.txt") || die "Datei nicht geoeffnet, weil: $!";
# способов прохода много, кстати как слова то разделяются?
# я предполагаю что одним из пробельных символов
# проходим по каждой строке и каждому слову...
while(<DATEI_1>){
    foreach(split) {
        $counter++ if exist $sort_list{$_}
    }
}
print "$counter";



Это сообщение отредактировал(а) Nab - 13.1.2007, 21:23


--------------------
 Чтобы правильно задать вопрос нужно знать больше половины ответа...
Perl Community 
FREESCO in Ukraine 
PM MAIL   Вверх
LisaST
Дата 13.1.2007, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 8.4.2006
Где: Munich

Репутация: нет
Всего: нет



спасибо за помощь, я прогнала программу amg на оригинальном файле с большим кол-вом слов, число одинаковых слов было слишком велико, тогда я решила разбить файл, где есть предложения на токен (исключить все знаки препинания етц) для простоты сравнения (разделитель в обоих файлах \n), еще раз прогнала программу amg, теперь рез-т, мне кажется достоверен, мне одинаковые слова нельзя удалять,т.к. потом рез-т будет использоваться для recall и precision 

sorry за простые вопросы,  я лингвист, а не программист. Не могу понять, почему в моем варианте выдавался рез-т для каждой строки, а не обще кол-во одинаковых слов, что надо поменять в counter?
    
PM MAIL   Вверх
Nab
Дата 13.1.2007, 23:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 582
Регистрация: 25.3.2006
Где: Kiev

Репутация: 26
Всего: 37



Не совсем понял по поводу повтора слов, хотя думаю так как второй файл скорее всего словарь, то там повторений то и нет. 

По поводу удаления малозначащих слов, типа знаков препинаний и предлогов, то у я решал похожую задачу, хотя там файлы были маленькие, но их было несколько тысяч... и нужно было найти похожие. Так вот похожесть была к тому же настраиваемая, да и вооще задачка была не из легких smile хотя интересая...

Вы бы конкретней задачу то нарисовали, а то не понятно что ищем... и что сравниваем...



--------------------
 Чтобы правильно задать вопрос нужно знать больше половины ответа...
Perl Community 
FREESCO in Ukraine 
PM MAIL   Вверх
LisaST
Дата 14.1.2007, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 8.4.2006
Где: Munich

Репутация: нет
Всего: нет



кстати, вы меня натолкнули на мысл с повторами слов,теперь я думаю , что рез-т может быть искажен

в общих чертах задача такая, я сравниваю performance 3 статистических taggers. Протестировала их на Browncorpus (> 1мил. токен). Есть также "goldstandard" корпус с тегами, на который я ориентируюсь при определении Recall i Precision.
1 проблема в том, что все теггеры используют разные тэги (для goldstandard их кол-во~85, а для других теггеров меньше). 

Сейчас я пытаюсь найти Recall i Precision для существительных. Я экстрагировала сущ. из моего tagged text и из goldstandard в 2 файла, теперь надо определить (грубо не затрагивая вопрос семантики), какие слова были определны верно тестируемым теггером, для этого просто хочу сравнить сущ. из 2 файла с сущ из 1 файла, но возникает проблема одинаковых слов, допустим одно и тоже слово встречается неск. раз в обоих файлах, каждый раз, когда в ф2 будте встречаться это слово- будут ли в counter  суммироваться все occurences в ф1 и так при следующем повоторе этого слова (или я не права? см. прог amg)

я так и разобралась, почему в меом вар-те counter не суммировал occurences, а выдавал boolishe значения?

спасибо

 
PM MAIL   Вверх
Nab
Дата 14.1.2007, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 582
Регистрация: 25.3.2006
Где: Kiev

Репутация: 26
Всего: 37



Упс, я конечно извиняюсь, но большинство употребленных Вами терминов мне знакомы, и перевод я их знаю, но в контексте они никак не вяжуться... smile 
Возможно для Вас они что-то и означают, но для простого программиста мало понятны smile
Вы не могли бы изложить задачу по-русски, и желательно дайте определение, что Вы понимаете под терминами:
performance - производительность
tagger - чет не понятно, типа заметок? и про теги вообще в Вашем понимании...
Токен - нужно определение
Recall - повторный вызов (чего?)
Precision - точность (чего?)

И что такое goldstandart? Я подозреваю для Вас это имя собственное...

У меня такое впечатление что текст Ваших постов - это не полный, правленный перевод оригинальных текстов... smile


--------------------
 Чтобы правильно задать вопрос нужно знать больше половины ответа...
Perl Community 
FREESCO in Ukraine 
PM MAIL   Вверх
LisaST
Дата 14.1.2007, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 8.4.2006
Где: Munich

Репутация: нет
Всего: нет



sorry, если сумбурно получилось, простым языком выражаясь теггер, это программа, кот присваивает каждому слову текста соотв. часть речи (подготовительная ступень для linguistic parsing), есть различные теггеры, я тестирую те, кот. работают по принципу марковской модели (статистические теггеры), вот здесь описано хорошо http://en.wikipedia.org/wiki/Part-of-speech_tagging
precision i recall на русский не переводятся, вот тут нашла их описание http://en.wikipedia.org/wiki/Information_retrieval,
в общих чертах, надо определить "качество" теггера, основываясь на кол-ве верно определенной им информации....да, что-то запутанно получается...но вот, в общих чертах. теперь мне надо эти R i P для основных категорий слов (сущ, глагол, прил етц) определить

goldstandard, это файл, в котором теги каждому слову были присвоены мануально, т.е. P i R максимально приближены к 100% (простым языком, вероятность того, что часть речи определа верно очень высока), т.е. это как бы эталон, на который я равняюсь при анализе "моих" теггеров 

токен- просто слово

Это сообщение отредактировал(а) LisaST - 14.1.2007, 21:35
PM MAIL   Вверх
amg
Дата 15.1.2007, 08:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 38
Всего: 50



Цитата(LisaST @  13.1.2007,  22:14 Найти цитируемый пост)
Не могу понять, почему в моем варианте выдавался рез-т для каждой строки, а не обще кол-во одинаковых слов, что надо поменять в counter?
Цитата(LisaST @  14.1.2007,  14:21 Найти цитируемый пост)
почему в меом вар-те counter не суммировал occurences, а выдавал boolishe значения?
Потому что в Вашем варианте зануление и печать счетчика $counter делались для каждой строки. Нужно просто эти операции (зануление и печать) вынести за пределы цикла while (и обязательно убрать конци строк (chomp)). 
Код

use strict;
open(DATEI_1, "perltest1.txt") || die "Datei nicht geoeffnet, weil: $!";
my @suchen = <DATEI_1>;
chomp(@suchen);
close(DATEI_1);

my $counter = 0;
open(DATEI_2, "perltest.txt") || die "Datei nicht geoeffnet, weil: $!";
while (<DATEI_2>) { 
   chomp;
     my $zeile = $_;
   foreach (@suchen) {
      my $suche = $_;
      if ( $zeile eq $suche ) { 
        $counter++;
      }
   }
}
print "$counter\n";

PM MAIL   Вверх
amg
Дата 15.1.2007, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 38
Всего: 50



Цитата(LisaST @  13.1.2007,  18:51 Найти цитируемый пост)
задача у меня сравнить какие слова из файла 1 встречаются в файле 2 и подсчитать их кол-во (в файле 1 на строке может быть предожение или одно слово, а в файле 2 на каждой строке одно слово).
Другими словами, частота употребления словарных слов (файл 2) в тексте (файл 1)? 
Код

use locale; # Если среди букв есть символы национальных алфавитов
use POSIX qw(locale_h);
setlocale(LC_CTYPE,"ru_RU.KOI8-R"); # Язык и кодировка для lc и регулярных выражений
setlocale(LC_COLLATE,"ru_RU.KOI8-R"); # Язык и кодировка для sort

open(DATEI_1, "perltest1.txt") || die; # Словарь
# На хэш расходуется много памяти. Осторожно, если словарь очень большой
# Одинаковые слова словаря считаются за одно. Регистр символов не учитывается.
%suchen = map {chomp; lc($_) => 0} <DATEI_1>;
close(DATEI_1);
print "В словаре ", scalar(keys %suchen), "слов\n\n";

open(DATEI_2, "perltest.txt") || die; # Текст
while (<DATEI_2>) { 
  while (/(\w{3,})/g) { # Разбор строки по словам. Слово здесь - последовательность букв или цифр длиннее 2
    $suchen{lc($1)}++ if exists $suchen{lc($1)};
  }
}
close(DATEI_2);

# Печатаем встретившиеся в тексте словарные слова с сортировкой по алфавиту
foreach (sort keys %suchen) {
  print "$_   $suchen{$_}\n" if $suchen{$_};
}

# Печатаем встретившиеся в тексте словарные слова с сортировкой по частоте
foreach (sort {$suchen{$b} <=> $suchen{$a}} keys %suchen) {
  print "$_   $suchen{$_}\n" if $suchen{$_};
}

# Печатаем общее кол-во встретившихся в тексте словарных слов
$counter = 0;
$counter1 = 0;
while ((undef,$v) = each %suchen) {
  if ($v) {
    $counter += $v;
    $counter1++;
  }
}
print "В тексте $counter1 уникальных словарных слов, а всего $counter словарных слов (не короче 3-х символов)\n";

PM MAIL   Вверх
LisaST
Дата 16.1.2007, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 8.4.2006
Где: Munich

Репутация: нет
Всего: нет



спасибо большое на ответ на вопрос про $counter и особенно за предложенную программу. Возникает такая проблема, Файл 1 не совсем словарь, там слова тоже могут повторяться и, например одно и тоже слово может повторятся в Ф1 3 раза и в Ф2 4 раза, мне надо вклучить это в статистику...например сейчас , если в файле-эталоне 3 одинаковых слова, а в Ф2 4, то каждый раз, когда будет происходить сверка со словарем все 3 occurences будут суммироваться или нет?
 
PM MAIL   Вверх
amg
Дата 17.1.2007, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 38
Всего: 50



Цитата(LisaST @  16.1.2007,  20:24 Найти цитируемый пост)
 Возникает такая проблема, Файл 1 не совсем словарь, там слова тоже могут повторяться и, например одно и тоже слово может повторятся в Ф1 3 раза и в Ф2 4 раза, мне надо вклучить это в статистику...например сейчас , если в файле-эталоне 3 одинаковых слова, а в Ф2 4, то каждый раз, когда будет происходить сверка со словарем все 3 occurences будут суммироваться или нет?

Я не вполне понял, каким образом нужно включать повторяющиеся слова "словаря" в статистику, но если заменить 1-ю строчку приведенного ниже фрагмента программы на 2-ю, то в хэше %suchen в качестве значений будут не нули, а кол-во повторений слова. Можно этим воспользоваться.
Код

#%suchen = map {chomp; lc($_) => 0} <DATEI_1>;
map {chomp; $suchen{lc $_}++} <DATEI_1>;

PM MAIL   Вверх
LisaST
Дата 18.1.2007, 01:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 8.4.2006
Где: Munich

Репутация: нет
Всего: нет



с последней программой получился очень странный результат, почему-то цифры тоже были включены в статистику:

пример результата:
Код

im woerterbuch 25615woerter

0   1
00   14
000   154
027   2
03   4
07   3
076   1
082   1
09   2
1   32
10   8
100   12
1020   1
105   1
108   4
109   1
11   8
110   2
111   1
12   2
120   1
125   3
128   1
12a   2
133   1
135   5
137   6
138   1
14   5
140   1
15   7
150   6
1500   1
16   1
165   1
17   4
170   3
18   2
184   1
185   1
187   1
1880s   2
1890s   2
1920s   7
1930s   4
1940s   1
1950s   5
1960s   2
1970s   2
2   19
20   15
200   9
20s   2
21   4
210   4
214   1
22   2
222   1
235   1
2400   1
25   3
250   5
2500   1
251   1
26   3
276   1
28   4
29   2
297   1
3   9
30   3
300   9
302   1
306   1
30s   4
310   1
3100   1
320tr   1
325   1
34   2
340tr   1
35   1
350   1
36   1
37   4
380   1
385   1
390   1
3m   1
3mm   1
4   14
40   3
400   4
401   1
4200   1
44001   2
44002   2
44005   2
44006   2
44007   2
45   4
450   4
460   1
47   3
490   1
49ers   2
5   16
50   24
500   25
5000   5
514   1
514c   1
52   18
52h   2
52s   2
538   2
550   1
555   1
56   1
561   1
565   1
56a   1
58   1
580   1
581   1
5th   2
6   6
60   9
600   14
60s   2
610   1
615   1
616   1
617   1
639   1
65   4
650   1
66   2
675   1
6th   2
7   10
70   13
700   6
72   1
720   1
738   2
740   1
742   1
742c   2
75   5
750   4
753   1
754   1
8   7
80   5
800   8
81   1
816   1
82   1
823   1
825   1
85   3
86   1
865   1
867   1
89   1
899   1
9   8
90   3
900   3
90s   2
918   1
94   1
940y   1
98   2
a   191
a135   1
a5   2
aa   2
aaa   2
aaron   14
ab   5
abandon   3
abandonment   20
abaringe   2
abasement   4
abatuno   2
abbas   5
abbe   6
abberations   2
abbey   13
abbot   4
abbott   4
abbreviation   2
abbreviations   2
abc   4
abdallah   2
abdomen   11
abdominis   2
abduction   2
abe   6
abel   37
abell   2
abelson   2
abernathy   3
abernathys   2
aberration   6
aberrations   10
abeyance   6
abigail   4
abilene   4
abilities   26




всего  uniq слов 25615, по идее это очень мало, плюс всех слов с повторениями 528720, тоже странный результат, с Вашей первой программой получилось 259227 существительных,что довольно приближено к истине, тогда для Precision i Recall получаются нормальные результаты.
PM MAIL   Вверх
amg
Дата 18.1.2007, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 38
Всего: 50



Цитата(LisaST @  18.1.2007,  01:10 Найти цитируемый пост)
с последней программой получился очень странный результат, почему-то цифры тоже были включены в статистику:
Такой результат означает лишь, что состоящие из цифр "слова" присутствовали в файле perltest1.txt ("словарь", "база существительных") и не исключались из рассмотрения при анализе файла perltest.txt ("текст"). Их можно не зачитывать из "словаря", а можно исключать при анализе текста, что именно делать, остается лишь догадываться.

Цитата(LisaST @  18.1.2007,  01:10 Найти цитируемый пост)
всего  uniq слов 25615, по идее это очень мало, плюс всех слов с повторениями 528720, тоже странный результат, с Вашей первой программой получилось 259227 существительных,что довольно приближено к истине, тогда для Precision i Recall получаются нормальные результаты.
Я даже не знаю, что тут сказать. Уважаемая LisaST, если бы Вы исчерпывающе и простыми словами, без употребления специальных терминов и ссылок на интернет сформулировали свою задачу и приложили бы образцы имеющих отношение к делу файлов, то, вне всяких сомнений, наше обсуждение было бы гораздо более плодотворным.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0934 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.