-1

我正在编写一个 php 脚本,它将解析一个文件 (synonyms.dat),并将同义词列表与其父词协调,大约 150k 词。

文件中的示例:

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

但我不知道如何链接每场比赛之间的字段,即同义词本身。

该脚本旨在运行一次,以便将所有信息适当地放入我的数据库中。对于那些感兴趣的人,我有一个数据库“synonym_index”,它保存了每个单词以及单词的唯一 ID。然后是另一个表“synonym_listing”,其中包含一个“word_id”列和一个“synomym_id”列,其中每一列都是 synonym_index 的外键。每个 word_id 可以有多个 synonym_id。

非常感谢您的帮助!

4

2 回答 2

0

哇,对于这种类型的功能,您拥有带有表和索引的数据库。PHP 是提供请求/响应,而不是将大文件读入内存。我建议您将数据放入数据库中。这会快得多 - 它是为此而设计的。

于 2013-05-20T13:29:22.403 回答
0

您可以使用explode()将每行拆分为字段。(或者,根据输入的精确格式,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 回答