アプリ版:「スタンプのみでお礼する」機能のリリースについて

ご教示お願い致します。

$str = 'テストが赤点だった→結果30点;
foreach $ch (split //, $str) {
print $ch, "\n";
}

上記変数を1文字ずつばらいており、
そこから、さまざまなパターンでくっつけ
あるテキストから似た部類のタイトルを探したいです。

あるテキスト→test.txt
---------------------------

明日はテスト
テスト合格
クラブ活動;;
試験・・・
赤点多すぎな件
打ち上げパーティー
100点!!

---------------------------

このテキストファイルで
$ch で生成された文字でヒットされるのは

---------------------------

明日はテスト
テスト合格
赤点多すぎな件
100点!!

---------------------------

このような結果がほしいのです
どのようにすれば、実行できますでしょうか?

A 回答 (9件)

$strのn-gramを求めて、test.txtの各行と比較してマッチした行を結果出力すれば良いと思います。



1-gram 「テ」「ス」「ト」「が」……「点」
2-gram 「テス」「スト」「トが」……「赤点」……「0点」
3-gram 「テスト」「ストが」「トが赤」「が赤点」……「30点」
    • good
    • 0
この回答へのお礼

御回答ありがとうございます。
もう少しで解決できそうです。

もう1つ教えてくださいm(_ _)m

my $str = "テストが赤点だった→結果30点";
my $retval = ConvertNGram($str, 2);
my @list = split(/\n/, $retval);
my $length = @list;

open(FILE, "<","test.txt") or die("error :$!");
eval{ flock(FILE, 1) };
my @KIJI = <FILE>;
close FILE;

my @AAA;
for(my $i=0;$i<=$length;$i++){
my $data = $list[$i];
chomp($data);
@AAA = grep(/$data/, @KIJI);
}

open(FILE, ">","vvv.txt") or die("error :$!");
eval{ flock(FILE, 2) };
print FILE @AAA;
close FILE;

sub ConvertNGram {
my $str = shift;
my $n = shift;
my $wsp = '';
$n=2 if (!$n || $n !~ /^[0-9]+$/);
$str =~ s/\n|\t| |$wsp//g;
my $slen = length($str);
return $str if $slen <= $n;
my @parts = ();
for(my $i=0; $i < $slen-$n+1; $i++){
push(@parts, substr($str, $i, $n));
}
return join("\n", @parts);
}

現在ここまでできました。
$retval→2文字ずつ分割
@list→分割した数

それらを用いて
forでまわし
@AAA = grep(/$data/, @KIJI);
このように、ここで旨いこといきません...
$dataを普通に文字にすると...
/$data/ → /テス/ に変えると
明日はテスト
テスト合格
この2つを取得できます。
しかし,$dataですと、全て取得してしまっています。なぜでしょうか・・・?

お礼日時:2017/12/20 15:16

・$data の値が適正であることは確認していますか?


・@AAA = grep(/$data/, @KIJI); でいいですか?
    • good
    • 0
この回答へのお礼

ありがとうございます。
>>$data の値が適正であることは確認していますか?

if($data ne ""){
@AAA = grep(/$data/, @KIJI);
}
こういうことでしょうか?

一応これで、できたのですが・・・
if($data ne "")←で値の適正を見てる
と判断していいのでしょうか・・・?

お礼日時:2017/12/21 09:08

根本的な間違いを孕んだまま表面的に直ってればいいというなら, それでいいかもね.



N-gram は長さ N の文字列です. 今の場合は N=2 だから N-gram (bigram) として長さ 2 の文字列になっているはずです. では, なぜ
if($data ne "")
という条件の有無によって挙動が変化するのでしょうか?
    • good
    • 0
この回答へのお礼

お返事が遅くなり申し訳ないございません・・

しばらく考えてみたのですが、よくわかりません・・・
具体的に教えて頂けると嬉しいです。

お礼日時:2017/12/25 10:53

my $length = @list;


の結果 $length には @list の「何」が入りますか? そして, それを使って
for(my $i=0;$i<=$length;$i++)
のように forループを回していいですか?

あと
・そもそも添え字は必要なのか
・なぜ return するときに join するのか
という突っ込みもあるかな.
    • good
    • 0
この回答へのお礼

@listには

テス
スト
トが
が赤
赤点
点だ
だっ
った
た→
→結
結果
果3
30
0点

これが入って、これの行数14が
$lengthに入ります・・・

そして、その分を
test.txtをオープンさせ
for(my $i=0;$i<=$length;$i++){
@BBB = grep(/$data/, @KIJI);
}
grepという風にしようとしている・・・

わからない・・・

お礼日時:2017/12/26 09:25

14個の要素を持つ配列の添え字として使っていいのはどこからどこまで?

    • good
    • 0
この回答へのお礼

すべてのつもりで、
$i<=$length;
と書きました。。。

お礼日時:2017/12/26 13:52

その返しは想像してなかったなぁ.... 「どこからどこまで?」に対しては「○○から○○まで」ってくるもんだとばっかり思ってたよ. 日本語って難しいなぁ.



でどこからどこまで?
    • good
    • 0
この回答へのお礼

すみません・・・

1個目から14個目までです・・・

お礼日時:2017/12/27 08:37

その「1個目から14個目まで」は, 添え字でいうとどこからどこまで?

    • good
    • 0
この回答へのお礼

テスから0点です!

お礼日時:2017/12/27 16:16

.... 想定したのと全然違うことが返ってくる. おもしろいといえばおもしろいが....



あなたは「添え字」をどのようなものだと考えているんでしょうか?
    • good
    • 0
この回答へのお礼

list[$i];←[]の部分のことですか・・・?

お礼日時:2017/12/28 08:36

あれ? 「添え字」はだいたいあってる. 正確には [] の中の式なんだけど.



ではそれに基づいて, 改めて #7 のやりとりを見てください.

「添え字でいうとどこからどこまで?」に対してあなたは「テスから0点です!」と書いています. これは, あなたが「テス」とか「0点」とかを「添え字」と認識していたことを意味するはずです.

一方 #1 に対して書いたプログラムでは
for(my $i=0;$i<=$length;$i++)
で動かしている $i を使って
my $data = $list[$i];
と書いています.

矛盾してませんか?

もう 1度確認してみよう.

「1個目から14個目まで」は, 添え字でいうとどこからどこまで?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!