クロスワード検索のためにPHPでgrepを使用したいと思います。 600,000行の単一の単語(ドイツ語の単語)を含む単語のリストがあります。
7文字(ABCDEFGなど)を入力し、それを使用して5040のすべての順列を作成し(7です!)、ほとんど意味のないすべてのスペルを変更する可能性(ABCDEFG、ABCDEGF、ABCDGEFなど)を入力して単語が存在することを確認したい。私のリストに。
私は16GBのRAM、PHP 8.0、Apache 2.4を搭載したUbuntu 22.04サーバーで動作しています。
これは、5040のスペル置換単語をすべてパターンとして追加する最良の方法ですか?たとえば、
shell_exec( 'grep "^ABCDEFG$\|^ABCDEGF$\|..." /path/to/wordlist.txt');
これは良い習慣ですか?それともfor nextループを使用して5040 grep呼び出しを行い、常に1つのパターンしか持たない方が良いですか?
grepは私が好きなだけ多くのパターンを取ることができることを読んだが、私の方法と同じくらい多くのパターンを持つコードを見つけることができませんでした。サーバーのパフォーマンスによって最大値が制限されると思われますが、まだテストしていません。サーバーの速度を遅くしたくありません。
それとも私のアプローチはあまり良くないので、ベストプラクティスは全く異なるのでしょうか?
私はsqliteを使用し、sqliteデータベースの単語リストを試しましたが(各単語にORを使用)、時間がかかりすぎて不可能です。
ヒントありがとうございます。
ベストアンサー1
スペル置換は文字の順序に興味がないため、これを無視するのが合理的かもしれません。代わりに、テスト中の単語の各文字数を数えるか、単語の文字を簡単に並べ替えます。計算またはソートされた文字列が、計算またはソートされたキー文字列のバージョンと一致する場合は、スペル置換単語があります。
Perlで簡単な1行のソリューションを書くことができます。次の入力ファイルをインポートします。
% cat test.txt
manbat
bantam
hello
これにより、ソート後に「aabmnt」を含む行が印刷されます。
% perl -lne 'chomp; print if join("", sort split //, $_) eq "aabmnt"' test.txt
manbat
bantam
join("", sort split //, $_)
現在の行を取得し、$_
文字を分割して並べ替えてから再接続します。
あるいは、より便利には、スクリプトでキーワードをソートして、検索キーワードが環境を通過するbatman
スペル置換語を提供する必要があります。
% key=batman perl -lne 'chomp; print if join("", sort split //, $_) eq join("", sort split //, $ENV{key})' test.txt
manbat
bantam