Source code for icenlp_bridge.bridge
import asyncio
import struct
from typing import Any, Awaitable, Optional, NoReturn
_PACKET_SIZE = 512
_DATA_SIZE = 504 # 512 - 2 * 4
_hostname = 'localhost'
_port = 1234
[docs]def writeData(writer: Any, data: bytes) -> NoReturn:
writer.write(struct.pack('!ii', 2, len(data)))
writer.write(data)
if len(data) < _DATA_SIZE:
writer.write(struct.pack('b', 0) * (_DATA_SIZE - len(data)))
[docs]async def icenlp_client(message: str) -> Awaitable[str]:
reader, writer = await asyncio.open_connection(_hostname, _port)
encoded = message.encode('utf-8')
out_packets = (len(encoded) // _DATA_SIZE) + 1
writeHeader(writer, out_packets)
for i in range(out_packets):
offset = _DATA_SIZE * i
writeData(writer, encoded[offset:offset + _DATA_SIZE])
data = await reader.readexactly(_PACKET_SIZE)
opcode, num_packets = struct.unpack('!ii', data[0:8])
assert opcode == 3, "Invalid opcode received"
received_data = []
for i in range(num_packets):
data = await reader.readexactly(_PACKET_SIZE)
opcode, len_data = struct.unpack('!ii', data[0:8])
assert opcode == 4, "Invalid opcode received"
received_data.append(data[8:len_data + 8])
received = b''.join(received_data)
writer.close()
await writer.wait_closed()
return received.decode('utf-8')
[docs]def init(hostname: Optional[str] = None,
port: Optional[int] = None) -> NoReturn:
"""Initialize IceNLP connection"""
global _hostname, _port
if hostname is not None:
_hostname = hostname
if port is not None:
_port = port
parse('Núna!')
[docs]def parse(text: str) -> str:
"""Parse text with IceNLP"""
return asyncio.get_event_loop().run_until_complete(icenlp_client(text))