Как получить идентификаторы токенов с помощью spaCy (я хочу сопоставить текстовое предложение с последовательностью целых чисел) - PullRequest
0 голосов
/ 08 ноября 2018

Я хочу использовать spacy для токенизации предложений, чтобы получить последовательность целочисленных идентификаторов токенов, которую я могу использовать для последующих задач. Я ожидаю использовать это как ниже. Пожалуйста, заполните ???

import spacy

# Load English tokenizer, tagger, parser, NER and word vectors
nlp = spacy.load('en_core_web_lg')

# Process whole documents
text = (u"When Sebastian Thrun started working on self-driving cars at ")

doc = nlp(text)

idxs = ??????

print(idxs)
# Want output to be something like;
>> array([ 8045, 70727, 24304, 96127, 44091, 37596, 24524, 35224, 36253])

Предпочтительно целые числа относятся к некоторому специальному идентификатору встраивания в en_core_web_lg ..

spacy.io / Использование / векторы-сходство не дает подсказки, какой атрибут в doc искать.

Я спрашивал об этом по перекрестно подтверждено , но это было определено как OT. Правильные термины для поиска / описания этой проблемы также полезны.

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

Решение;

import spacy
nlp = spacy.load('en_core_web_md')
text = (u"When Sebastian Thrun started working on self-driving cars at ")

doc = nlp(text)

ids = []
for token in doc:
    if token.has_vector:
        id = nlp.vocab.vectors.key2row[token.norm]
    else:
        id = None
    ids.append(id)

print([token for token in doc])
print(ids)
#>> [When, Sebastian, Thrun, started, working, on, self, -, driving, cars, at]
#>> [71, 19994, None, 369, 422, 19, 587, 32, 1169, 1153, 41]

Разбить это;

# A Vocabulary for which __getitem__ can take a chunk of text and returns a hash
nlp.vocab 
# >>  <spacy.vocab.Vocab at 0x12bcdce48>
nlp.vocab['hello'].norm # hash
# >> 5983625672228268878


# The tensor holding the word-vector
nlp.vocab.vectors.data.shape
# >> (20000, 300)

# A dict mapping hash -> row in this array
nlp.vocab.vectors.key2row
# >> {12646065887601541794: 0,
# >>  2593208677638477497: 1,
# >>  ...}

# So to get int id of 'earth'; 
i = nlp.vocab.vectors.key2row[nlp.vocab['earth'].norm]
nlp.vocab.vectors.data[i]

# Note that tokens have hashes but may not have vector
# (Hence no entry in .key2row)
nlp.vocab['Thrun'].has_vector
# >> False
0 голосов
/ 08 ноября 2018

Spacy использует хеширование текстов для получения уникальных идентификаторов. Все Token объекты имеют несколько форм для разных вариантов использования данного Token в Document

Если вы просто хотите получить нормализованную форму Token s, используйте атрибут .norm, представляющий собой целочисленное представление текста (хешированный)

>>> import spacy
>>> nlp = spacy.load('en')
>>> text = "here is some test text"
>>> doc = nlp(text)
>>> [token.norm for token in doc]
[411390626470654571, 3411606890003347522, 7000492816108906599, 1618900948208871284, 15099781594404091470]

Вы также можете использовать другие атрибуты, такие как строчный целочисленный атрибут .lower или многие другие. Используйте help() на Document или Token для получения дополнительной информации.

>>> help(doc[0])
Help on Token object:

class Token(builtins.object)
 |  An individual token – i.e. a word, punctuation symbol, whitespace,
 |  etc.
 |  
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...