2013-05-20 2 views
-1

나는 파일 (synonyms.dat)을 통해 구문 분석하고 약 150k 단어에 대해 그들의 상위 단어와 동의어 목록을 조정하는 PHP 스크립트를 작성 중입니다. 파일에서Preg-Match-All - 동의어 파일

예 : 예에서

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** 

내가 연결할 위에 만,로 .DAT 파일을 읽는의 무수한 단어 1000

에 큰 내가 시도 다양한 방법 memory는 file_get_contents를 사용하고 \ n에서 파일을 폭발시키고 다양한 배열 검색 기술을 사용하여 '부모'단어와 동의어를 찾습니다. 그러나 이것은 매우 느리고 더 자주 내 웹 서버를 손상시키지 않습니다.

필자가해야 할 일은 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 

일치하지만 각 경기, IE 동의어 자신 사이에 필드를 연결하는 방법을 모르겠어요.

이 스크립트는 모든 정보를 내 데이터베이스에 적절하게 가져 오기 위해 한 번 실행됩니다. 관심있는 사람들을 위해, 나는 단어뿐만 아니라 각 단어의 유일한 ID를 보유하고있는 데이터베이스 'synonym_index'를 가지고있다. 그런 다음 'word_id'열과 'synomym_id'열을 포함하는 'synonym_listing'테이블 각각은 synonym_index에 대한 외래 키입니다. 각 word_id에는 synonym_id가 여러 개있을 수 있습니다.

귀하의 도움에 감사드립니다.

답변

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**') 
    //) 
} 
+0

완벽! 내가 뭘 찾고 있었는지. 변수 이름을 제외하고 모든 것이 제대로 작동하도록 변경해야한다는 귀하의 제안에 반하는 것입니다. 필자의 원본보다 훨씬 나은 해결책이며, $ partofSpeech 변수를 포함하면 많은 도움이됩니다. –

0

와우,이 유형의 기능을 사용하려면 테이블과 색인이있는 데이터베이스가 있어야합니다. PHP는 큰 파일을 메모리로 읽어 들이지 않고 요청/응답을 제공합니다. 데이터를 데이터베이스에 저장하는 것이 좋습니다. 그것은 훨씬 더 빠를 것입니다. 그리고 그것을 위해 만들어졌습니다.

+0

의도 이 스크립트를 한 번만 실행하면 내가 만든 데이터베이스에 데이터를 저장하고 데이터베이스 요구 사항을 반영하도록 질문을 업데이트합니다. 죄송 합니다만, 나는이 질문에서 필요하다고 생각하지 않았습니다. –

+0

사과드립니다. :-) PleaseStand에서 제공하는 좋은 솔루션입니다. 나는 줄의 배열을 반환하는 file을 사용하는 것이 좋을 것이다. 나는 그것이 항상 매우 편리하다고 생각한다. –