Список сообщений в Python

Привет, мне нужно создать диктофон из списка уникальных слов, токенизированных и обработанных из нескольких файлов. Таким образом, окончательный формат словаря сообщений будет следующим: {wordid: [0, 1, ...], wordid2: [0, 1, ...]},

Я действительно борюсь с этим, единственный код, который у меня есть сейчас:

    for i in range(len(docids)):
      for word in vocab:
        if word not in postings.keys():
          postings[word] = []
        else:
          postings[word].append(i)    

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

Пример ввода и ожидаемого вывода:
Doc1 = привет, меня зовут Джон, Doc2 = привет, меня зовут Смит.
Это составит список слов: ['привет', 'мой ', 'имя', 'есть', 'джон, 'привет', 'второй', 'кузнец'].
Каждое слово имеет wordid, который является просто индексом слова.

И docid: [0, 1]
(это просто подсчитывает документы и используется при создании списка сообщений, чтобы сказать: слово w встречается в документе doc)

Конечным результатом этого примера будет:

postings = {0: [0], 1: [0,1], 2: [0,1], 3: [0,1], 4: [0], 5: [1], 6: [1], 7: [1]}

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

Также предполагается, что программа в целом будет запускаться с терминала и передавать ей каталог и количество файлов в качестве аргументов.


person Community    schedule 02.12.2020    source источник
comment
Я вообще не понял вашего вопроса... Что у вас есть на входе? Что содержат docids и vocab?   -  person adir abargil    schedule 02.12.2020
comment
Это вопрос с перевернутым индексом (информационным поиском), в котором обычно используются списки docid и vocab, docid — это список, содержащий все URL-адреса и индекс документов, из которых читаются. Vocab содержит все слова из каждого документа, за исключением повторяющихся слов.   -  person    schedule 02.12.2020
comment
Было бы полезно, если бы вы могли предоставить небольшой пример с заданными входными данными (docids, vocab, postings,...) и ожидаемым выходным словарем для этого случая.   -  person Querenker    schedule 02.12.2020
comment
Спасибо, только что добавил, надеюсь теперь проблема понятнее   -  person    schedule 02.12.2020


Ответы (2)


Идем построчно:

for i in range(len(docids)):

Вы переходите диапазон, но содержимое массива равно [0, 1, ..], и вам нужно добавить docids к postings, а не к их индексу, поэтому вы должны пойти:

for docid in docids:

Следующий:

  for word in vocab:

Поскольку вы хотите, чтобы wordid был его индексом в словаре, а не самим словом, вы должны указать диапазон здесь или что-то в этом роде (также, пожалуйста, используйте стандартный отступ 4 в Python, почти все остальные):

    for wordid, word in enumerate(vocab):

А потом:

        if word not in postings.keys():

Вы хотите добавить ключ, если он не существует, или добавить к нему, если он существует. Вот для чего предназначено defaultdict(list), поэтому инициализируйте postings = defaultdict(list), и вам не понадобятся следующие несколько строк.

Наконец, вам нужно проверить, есть ли слово в документе, но в вашем коде нет проверки, которая действительно проверяет, есть ли слово в документе. Поскольку вы уже обработали весь набор документов, создав vocab, кажется расточительным снова искать каждое слово по отдельности в каждом документе.

Вы должны построить свой postings так же, как вы строите vocab.

Если вы должны сделать это таким образом, имеет смысл перебирать все, что содержит ваши документы, а не docids, но трудно предоставить код, который будет работать, потому что вы не делитесь примерами значений переменных, которые вы используете .

person Grismar    schedule 02.12.2020

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

# This would be you're list of files
Docs = [
    "Hello my name is John",
    "Hi my second name is Smith"
]

vocab = []
postings = {}
for i,doc in enumerate(Docs):
    # if using files for Docs this is 
    # where you read the text from them
    words = doc.split(" ")
    for word in words:
        if word not in vocab:
            vocab.append(word)
        wordId = vocab.index(word)
        if wordId not in postings:
            postings[wordId] = [i]
        else:
            postings[wordId].append(i)

print(postings)
#{0: [0], 1: [0, 1], 2: [0, 1], 3: [0, 1], 
# 4: [0], 5: [1], 6: [1], 7: [1]}
person mrgreytop    schedule 02.12.2020