2016-09-13 8 views
0

をperlの例については、このテキストを含む:コサイン類似度は、私はファイルを持っている

perl java python php scala 
java pascal perl ruby ada 
ASP awk php java perl 
C# ada python java scala 

私は

、bignningで簡単なテストをした http://search.cpan.org/~wollmers/Bag-Similarity-0.019/lib/Bag/Similarity/Cosine.pm

、コサインsimilaityを計算モジュールを見つけました

my $cosine = Bag::Similarity::Cosine->new; 
my $similarity = $cosine->similarity(['perl','java','python','php','scala'],['java','pascal','perl','ruby','ada']); 
print $similarity; 

ルスルートは0.4であり;

open(F,"/home/ahmed/FILE.txt") or die " Pb pour ouvrir"; 
my @data; # containt each line of the FILE in each case 

while(<F>) { 
    chomp; 
    push @data, $_; 
} 
#print join " ", @data; 

my $cosine = Bag::Similarity::Cosine->new; 

for my $i (0 .. $#data-1) { 

    for my $j ($i + 1 .. $#data) { 

my $similarity = $cosine->similarity($data[$i],$data[$j]); 

print "line $i a une similarite de $similarity avec line $j\n"; 

$i + 1, 

      $j + 1; 
} 
} 

結果:

line 0 has a similarity of 0.933424735647156 with line 1 
line 0 has a similarity of 0.953945734121021 with line 2 
line 0 has a similarity of 0.939759036144578 with line 3 
line 1 has a similarity of 0.917585834612093 with line 2 
line 1 has a similarity of 0.945092544842746 with line 3 
line 2 has a similarity of 0.908826679128811 with line 3 

類似必要

iは、ファイルから読み込まれ、各ライン間の余弦を計算する問題は、結果が異なる場合、これはコードであります1行目と2行目の間に0.4とする。

私はこのようなファイルに変更:

['perl','java','python','php','scala'] 
['java','pascal','perl','ruby','ada'] 
['ASP','awk','php','java','perl'] 
['C#','ada','python','java','scala'] 

が、同じ結果を、 ありがとうございました。

+0

入力ファイルに作ることは非常に奇妙な変更です。配列参照の文字列表現のように見えました。あなたはどこからそのアイデアを得ましたか? –

+1

私はそれが奇妙なことを知っている、私はこの質問を投稿する前にすべてのソリューションを試した、これはエラーなしで、私の最初のステップは、私たちは学ぶことはできません:) – Ahmed

答えて

1

プログラムに構文エラーがあります。 printfを使用しようとしましたが、printを誤って使用しましたか?あなたについてはわかりませんが、私のためにはうまく動作します。

#!/usr/bin/perl 
use strict; 
use warnings; 
use Bag::Similarity::Cosine; 

my $cosine = Bag::Similarity::Cosine->new; 
my @data; 

while (<DATA>) { 
    push @data, { map { $_ => 1 } split }; 
} 

for my $i (0 .. $#data-1) { 
    for my $j ($i + 1 .. $#data) { 
     my $similarity = $cosine->similarity($data[$i],$data[$j]); 
     print "line $i has a similarity of $similarity with line $j\n"; 
    } 
} 

__DATA__ 
perl java python php scala 
java pascal perl ruby ada 
ASP awk php java perl 
C# ada python java scala 

出力:

line 0 has a similarity of 0.4 with line 1 
line 0 has a similarity of 0.6 with line 2 
line 0 has a similarity of 0.6 with line 3 
line 1 has a similarity of 0.4 with line 2 
line 1 has a similarity of 0.4 with line 3 
line 2 has a similarity of 0.2 with line 3 
+0

本当に私は、配列ref、map、grepで多くの問題を抱えています... perlの完全なコースをしてください – Ahmed

+0

あなたはむしろハッシュの参照にデータを変換している理由配列のリファレンスよりも?私はこの分野については何も知らないので、明らかに何かが欠けているかもしれません。 –

0

私はこのモジュールについて何も知りません。しかし、私はthe documentationを読むことができます。

モジュールには2つの方法があります。 similarity()は2つの文字列の比較に使用され、from_bags()は文字列を含む配列への2つの参照の比較に使用されます。​​に2つの配列参照を渡すと、実際には2つの参照のストリング化が比較されます。

from_bags()に切り替えてみてください。

更新:さらに調べると、similarity()はどんな種類の入力(文字列、配列参照またはハッシュリファレンス)を比較することがわかります。

これは、similarity()を使用して行をテキストとして比較し、単語の配列として比較します。

#!/usr/bin/perl 

use strict; 
use warnings; 
use 5.010; 

use Bag::Similarity::Cosine; 

chomp(my @data = <DATA>); 

my $cos = Bag::Similarity::Cosine->new; 

for my $i (0 .. $#data - 1) { 
    for my $j (1 .. $#data) { 
    next if $i == $j; 
    say "$i -> $j: strings ", $cos->similarity($data[$i], $data[$j]); 
    say "$i -> $j: array refs ", $cos->similarity([split /\s+/, $data[$i]], [split /\s+/, $data[$j]]); 
    } 
} 

__DATA__ 
perl java python php scala 
java pascal perl ruby ada 
ASP awk php java perl 
C# ada python java scala 

そしてそれは、この出力を与える:

$ perl similar 
0 -> 1: strings 0.88602000346543 
0 -> 1: array refs 0.4 
0 -> 2: strings 0.89566858950296 
0 -> 2: array refs 0.6 
0 -> 3: strings 0.852802865422442 
0 -> 3: array refs 0.6 
1 -> 2: strings 0.872356744289958 
1 -> 2: array refs 0.4 
1 -> 3: strings 0.884721984738799 
1 -> 3: array refs 0.4 
2 -> 1: strings 0.872356744289958 
2 -> 1: array refs 0.4 
2 -> 3: strings 0.753778361444409 
2 -> 3: array refs 0.2 

私はあなたが欲しい情報を提供しているバージョンがわかりません。私は配列リファレンスバージョンかもしれないと思う。

+0

私も試した、私はこのエラーが、 Bag/Similarity/Cosine.pmで "strict refs"が使用されている間、ARRAY refとしての['perl'、 'java'、 'python'、 'php'、 's "...)、cosine.pmは上のリンクからダウンロードした長い構成ファイル – Ahmed

+0

あなたは配列参照が必要な場所を使用しているようです。しかし、あなたが何を変えたか分からずに、私はこれ以上助けになることはできません。 –

+0

ありがとうDave、それは動作します:) – Ahmed

関連する問題