0

Python 文字列から場所名が始まる文字列の先頭から、UTF-16 コード単位の数を抽出する必要があります。Polyglot NER を使用して、Python 文字列の場所にタグを付けています。たとえば、「オバマは米国で生まれました。しかし、私はアラバマで生まれました」の場合、「米国」と「アラバマ」をマークします。Python Polyglot エクストラクタは、タグ付けされた場所と、それらが開始する先頭からの単語数を返すだけです。単語が出現する文字列の先頭からの UTF-16 コード単位の数を把握するにはどうすればよいですか?

情報を必要とする Java インターフェースhttps://github.com/Berico-Technologies/CLAVIN/blob/master/src/main/java/com/bericotech/clavin/extractor/LocationOccurrence.java

4

1 に答える 1

0

@Ignacio Vazquez-Abrams のコメントの一部を明確にするためです。テキストを処理または分析するとき、特定の文字が何バイトを占めるかを心配する必要はありません。そのため、最初にエンコードされたテキストを別の text/str 表現に「デコード」することにより、式から「エンコード」を取り除きます。

>>> encoded_text = 'hello world'.encode('utf16')
>>> encoded_text
b'\xff\xfeh\x00e\x00l\x00l\x00o\x00 \x00w\x00o\x00r\x00l\x00d\x00'
>>> type(encoded_text)
<class 'bytes'>
>>> len(encoded_text)
24


>>> decoded_text = encoded_text.decode('utf16')
>>> decoded_text
'hello world'
>>> type(decoded_text)
<class 'str'>
>>>
>>> len(decoded_text)
11

UTF-16 code unitsあなたが投稿したJavaコードで見ました...

次のようにして、最初からバイト数を取得できます。

sentence = "Obama was born in the United States. But I was born in Alabama".encode('UTF-16LE')
word = 'United States'.encode('UTF-16LE')

bytes_from_start = None
for start_byte_position in range(len(sentence)):
    candidate = sentence[start_byte_position: start_byte_position + len(word)]
    if word == candidate:
        bytes_from_start = len(sentence[:start_byte_position])
        print('bytes from start: ', bytes_from_start)
        print('len(sentence[:start_byte_position]): ', len(sentence[:start_byte_position]))
        print('Preceding text: "{}"'.format(sentence[:start_byte_position].decode('UTF-16LE')))
        break

しかし、 UTF-16 コード単位==バイトかどうかはまだ明確ではありません。最初からキャラ数だけ欲しい感じです。それだけで十分な場合は、str オブジェクトの .index() メソッドを使用できます。

sentence = "Obama was born in the United States. But I was born in Alabama"
word = 'United States'
characters_from_start = sentence.index(word)
于 2016-09-23T00:42:57.630 に答える