2017-11-27 24 views
2

다양한 스탠포드 NLP 응용 프로그램에 연결하는 Perl 스크립트를 작성하려면 어떻게해야합니까?다양한 스탠포드 nlp 응용 프로그램에 연결하는 펄 스크립트를 작성하려면 어떻게해야합니까?

스탠포드 품사 및 명명 된 엔티티 응용 프로그램을 모두 서버로 호출했으며 명령 줄에서 요청을 보내면 원하는 응답이 표시됩니다. 여기에 예제 명령 행 호출은 다음과 같습니다

cat file.txt | nc localhost 8081 
지금 펄 기반 명령 줄 스크립트뿐만 아니라 같은 일을 할 수있는 펄 기반의 CGI 스크립트를 모두 쓰고 싶지만 얻는 데 문제입니다

전체 응답을 되 돌리십시오. 여기 내 스크립트 (들)에서 가장 두드러진 라인은 다음과 같습니다

# initialize 
my $text  = ''; 
my $response = ''; 

# get the text to process and normalize it for xml 
$text = &slurp($file); 
$text =~ s/\&/\&/g; 
$text =~ s/</\&lt;/g; 
$text =~ s/>/\&gt;/g; 
$text =~ s/\W+/ /g; 

# open a connection, send the data, and get the response 
my $socket = new IO::Socket::INET(PeerHost => HOST, PeerPort => PORT, Proto => PROTOCOL); 
if (! $socket) { die "Cannot connect to the server $!\n" } 
$socket->send("$text\n"); 
$socket->recv($response, 10240000); 
$socket->close(); 

이 작은 파일에 대한 잘 작동하지만 종종 상관없이 내가 버퍼 (10240000)를 증가하는 것 얼마나 큰, 더 큰 파일을하지하지 않습니다. 또한 서버에 의해 반환되는 데이터 양 (또는 클라이언트에 의해 더 구체적으로 수신 됨)은 절대로 같은 크기가 아닙니다. 때때로 응답은 다른 시간보다 크거나 작습니다.

언제 수신을 중단해야하는지 알 수 있습니까?

내가 뭘 잘못하고 있니?

+1

평범하지 않은 양의 데이터를 다루는 경우 더욱 강력하게 구현해야합니다. 대부분의 TCP 소켓은 쓰기 버퍼 제한을 가지고 있으며이를 날려 버리면 오류 상태에서 데이터가 무시되거나 프로그램이 중단 될 위험이 있습니다. 일반적으로 ['select'] (http://perldoc.perl.org/functions/select.html)를 사용하여 소켓에 쓸 수 있는지 테스트 할 수있을뿐만 아니라 읽을 수있는 데이터가 있는지 테스트 할 수 있습니다. 이것은 당신이 보내기 및/또는 읽기를 완료 할 때까지 반복적으로 투표를하는 루프 안에 있습니다. – tadman

+0

흥미 롭습니다! 서버가 요청 전체를 수신하고 있다고 확신하기 때문에 어떻게 "반복적으로 폴링"할 수 있습니까? – ericleasemorgan

+1

그것이 바로'선택 '입니다. 그것은 읽을 데이터 또는 버퍼 공간을 기록 할 때 알려줍니다. 루프 안에 넣으면 반쯤 있습니다. – tadman

답변

0

나는 내 문제를 해결했다고 생각합니다. tadman은 정확했다. 나는 다음과 같이 할 필요가 있었다 : 1) "사소한 양의 데이터"로보다 견고하게 작업하고, 2) select를 사용하여 일종의 대기 기술을 구현해야했다.

# robustly read from a socket; see http://www.perlmonks.org/?node_id=54146 

# initialize 
my $text  = &slurp($cgi->tmpFileName($input)); 
my $rbits = ''; 
my $timeout = 20; 
my $buffer = 10240; 
my $host  = 'localhost'; 
my $port  = '8081'; 
my $protocol = 'tcp'; 

# open the socket and write the text; needs error checking 
my $socket = IO::Socket::INET->new(PeerAddr => $host, PeerPort => $port, Proto => $protocol); 
$socket->write("$text\n"); 

# loop, forever 
while (1) { 

    # set the bit flag; ??? 
    vec($rbits, $socket->fileno, 1) = 1; 

    # wait; magic happens here 
    if (select($rbits, undef, undef, $timeout) >= 0 && vec($rbits, $socket->fileno, 1)) { 

     # re-initialize, read and update the response 
     my $stream = ''; 
     my $result = $socket->read($stream, $buffer); 
     $response .= $stream; 

     # done, maybe 
     last unless $result; 

    } 

    else { last } 

} 

# done 
print "$response\n"; 

내가 낮은 수준의 인터페이스는 혼란 발견 : 여기에 꽤 잘 작동하는 것 같다 내 솔루션입니다. 예를 들어, 나는 vec 나 선택할 매개 변수를 정말로 이해하지 못합니다. 그들은 C와 매우 비슷하게 보입니까?

어쨌든 나는 예전보다 훨씬 더 나아 갔다. 고맙습니다.