Можно ли отследить слова до оригинального документа в doc2vec? - PullRequest
1 голос
/ 01 ноября 2019

Я хотел бы создать набор данных doc2vec / word2vec, который может отследить или запомнить его первоначальное расположение. На данный момент я хотел бы знать, из какой строки или TXT-файла он пришел, но в будущем даже его первоначальный абзац. Например, я хотел бы иметь возможность сделать это с несколькими файлами TXT или CSV.

Поиск похожих кодов или подобных идей не оправдал себя. Поэтому мне любопытно, знает ли кто-то еще, как это вообще возможно, и даже если бы вообще было возможно; вставьте или дайте словам запомнить его исходное местоположение (документ).

Пример ввода:

        Author    |   Title   |     d2v_text     
———————————————————————————————————————————————————————————————————————————                  
0          Name 1 |  Title 1  | this is the first text. first text paragraph.    
1          Name 2 |  Title 2  | this is the second text. second text paragraph.
2          Name 3 |  Title 3  | this is the thirth text. thirth text paragraph.

Name1Title1.txt  (this is the first text. first text paragraph) 
Name2Title2.txt  (this is the second text. second text paragraph)
Name3Title3.txt  (this is the thirth text. thirth text paragraph)

Пример вывода:

(‘second’, 0.2384900293, ‘Name2Title2’)
(‘text’,0.34948302,’Name1Title1,Name2Title2,Name3Title3’) 

w1 = [“text”]
model.wv.most_similar (positive=w1,topn=1)

[(‘second’, 0.2384900293, ‘Name2Title2’)]

Чего я хотел бы добиться, так это того, чтобы при загрузке и печати определенного вектора из набора данных он знал свой исходный документ. Может ли кто-нибудь помочь мне с этим?

1 Ответ

2 голосов
/ 01 ноября 2019

Эти модели не хранят свои тренировочные данные - они просто наблюдают их во время каждого из тренировочных проходов, чтобы построить свои векторные модели для каждого слова или документа.

Для Doc2Vec векторов документов традиционно называют вектор документов с каким-то уникальным ключом к исходному документу, таким как идентификационный номер или имя файла. Так что для векторов документов тег, сообщенный с результатами, вероятно, уже содержит ключ, который вам нужен.

Для слов, когда вы хотите получить список всех документов, в которых появляется слово, используются два традиционных подхода:

  • сканирование методом перебора, как с командойлинейная программа grep, где вы просматриваете каждое слово в каждом документе и возвращаете список документов, в которых появилось слово. Например, если у вас есть каталог с вашими файлами Name1Title1.txt и т.д., команда grep -l -E '(^|\W)second(\W|$)' *.txt напечатает эти файлы, содержащие слово second. Конечно, это очень медленно на большом корпусе.

  • создание инвертированного индекса , какие документы содержат какие слова. Затем, после затрат на одно сканирование и создание / сохранение индекса, поиск списка документов для любого слова происходит очень быстро. Это основополагающий метод, позволяющий использовать полнотекстовые поисковые системы.

Простой инвертированный индекс занимает всего несколько строк Python:

from collections import defaultdict
docs = (  # tuples of doc-name, words
    ('Name1Title1.txt', "this is the first text. first text paragraph".split()),
    ('Name2Title2.txt', "this is the second text. second text paragraph".split()),
    ('Name3Title3.txt', "this is the thirth text. thirth text paragraph".split()),
)
inv_index = defaultdict(list)
for title, words in docs:
    for word in set(words):
        inv_index[word].append(title)

Затем список любых документов, в которых появилось слово, представляет собой простой поиск:

>>> inv_index['second']
['Name2Title2.txt']
>>> inv_index['this']
['Name1Title1.txt', 'Name2Title2.txt', 'Name3Title3.txt']

Инвертированные индексы могут быть довольно большими, и поэтому для компактности часто используются другие структуры данных, в том числе файловые индексы - поэтому, если ваш корпус большой, вам может потребоваться исследовать другие библиотеки для инвертированной индексации, чтобывозможность создать свой индекс и выполнять поиск на практике.

...