-1

ファイル (synonyms.dat) を解析し、同義語のリストを親語と調整する PHP スクリプトを作成しています。約 15 万語です。

ファイルの例:

1|2
(adj)|one|i|ane|cardinal 
(noun)|one|I|ace|single|unity|digit|figure
1-dodecanol|1
(noun)|lauryl alcohol|alcohol
1-hitter|1
(noun)|one-hitter|baseball|baseball game|ball
10|2
(adj)|ten|x|cardinal 
(noun)|ten|X|tenner|decade|large integer
100|2
(adj)|hundred|a hundred|one hundred|c|cardinal 
(noun)|hundred|C|century|one C|centred|large integer
1000|2
(adj)|thousand|a thousand|one thousand|m|k|cardinal 
(noun)|thousand|one thousand|M|K|chiliad|G|grand|thou|yard|large integer
**10000|1
(noun)|ten thousand|myriad|large**

上記の例では、万、無数、大を 1000 という単語にリンクしたいと考えています。

file_get_contents を使用して .dat ファイルをメモリに読み込み、\n でファイルを展開し、さまざまな配列検索手法を使用して「親」の単語と同義語を見つけるさまざまな方法を試しました。ただし、これは非常に遅く、多くの場合、Web サーバーがクラッシュすることはありません。

私がする必要があるのは、 preg_match_all を使用して文字列を分解し、文字列を反復処理して、適切な場所にデータベースに挿入することだと思います。

$contents = file_get_contents($page);
preg_match_all("/([^\s]+)\|[0-9].*/",$contents,$out, PREG_SET_ORDER);

これはそれぞれにマッチします

1|2

1-dodecanol|1

1-hitter|1

しかし、各一致の間にフィールドをリンクする方法がわかりません。つまり、シノニム自体です。

このスクリプトは、データベースにすべての情報を適切に取得するために、1 回実行することを目的としています。興味のある方のために、単語だけでなく、各単語の一意の ID を保持するデータベース 'synonym_index' を用意しています。次に、「word_id」列と「synomym_id」列を含む別のテーブル「synonym_listing」。各列は synonym_index への外部キーです。各 word_id に対して複数の synonym_id が存在する場合があります。

あなたの助けは大歓迎です!

4

2 に答える 2

0

うわー、このタイプの機能には、テーブルとインデックスを持つデータベースがあります。PHP は、大きなファイルをメモリに読み込むのではなく、要求/応答を提供することを目的としています。データをデータベースに入れることをお勧めします。それははるかに高速になります-そしてそれはそのために作られています.

于 2013-05-20T13:29:22.403 に答える
0

expand()を使用して、各行をフィールドに分割できます。(または、入力の正確な形式によっては、fgetcsv()の方が適している場合もあります。)

具体的な例。これは、特定のユース ケースとデータ形式に合わせてほぼ確実に調整する必要があります。

$infile = fopen('synonyms.dat', 'r');
while (!feof($infile)) {
    $line = rtrim(fgets($infile), "\r\n");
    if ( $line === '' ) {
        continue;
    }

    // Line follows the format HEAD_WORD|NUMBER_OF_SYNONYM_LINES
    list($headWord, $n) = explode('|', $line);
    $synonyms = array();

    // For each synonym line...
    while ( $n-- ) {
        $line = rtrim(fgets($infile), "\r\n");
        $fields = explode('|', $line);
        $partOfSpeech = substr(array_shift($fields), 1, -1);
        $synonyms[$partOfSpeech] = $fields;
    }

    // Now here, when $headWord is '**10000', $synonyms should be array(
    //     'noun' => array('ten thousand', 'myriad', 'large**')
    // )
}
于 2013-05-20T14:44:11.153 に答える