为包含单词的列表生成唯一ID

2024-10-02 20:34:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个单词对列表,并希望描述ID上的单词。id应该从0到len(set(words))。现在的列表如下所示:

[['pluripotent', 'Scharte'],
 ['Halswirbel', 'präventiv'],
 ['Kleiber', 'Blauspecht'],
 ['Kleiber', 'Scheidung'],
 ['Nillenlutscher', 'Salzstangenlecker']]    

结果应该具有相同的格式,但是使用id代替。例如:

[[0, 1],
 [2, 3],
 [4, 5],
 [4, 6],
 [7, 8]]

到目前为止,我有这个,但它没有给我正确的输出:

def words_to_ids(labels):
  vocabulary = []
  word_to_id = {}
  ids = []
  for word1,word2 in labels:
      vocabulary.append(word1)
      vocabulary.append(word2)

  for i, word in enumerate(vocabulary):
      word_to_id [word] = i
  for word1,word2 in labels:
      ids.append([word_to_id [word1], word_to_id [word1]])
  print(ids)

输出:

[[0, 0], [2, 2], [6, 6], [6, 6], [8, 8]]

它是在有唯一单词的地方重复id。你知道吗


Tags: toinidids列表forlabels单词
2条回答

有两个问题:

  1. 您通过在word_to_id中重复查找word1而造成了一个输入错误。你知道吗
  2. 在构建word_to_id字典时,只需要考虑唯一值。你知道吗

例如,在Python 3.7+中,可以利用插入顺序字典:

for i, word in enumerate(dict.fromkeys(vocabulary)):
    word_to_id[word] = i

for word1, word2 in labels:
    ids.append([word_to_id[word1], word_to_id[word2]])

3.7之前版本的另一种选择是使用^{}^{} ^{} recipe。你知道吗

如果没有订购要求,您可以使用set(vocabulary)。你知道吗

你有两个错误。首先,你有一个简单的打字错误,这里:

for word1,word2 in labels:
    ids.append([word_to_id [word1], word_to_id [word1]])

您正在添加word1的id两次,在那里。改为更正第二个word1以查找word2。你知道吗

接下来,您将不测试您以前是否见过一个单词,因此对于'Kleiber',您首先给它id 4,然后在下一次迭代中用6覆盖该条目。您需要给出唯一的单词编号,而不是所有单词:

counter = 0
for word in vocabulary:
    if word not in word_to_id:
        word_to_id[word] = counter
        counter += 1

或者,如果已经列出了一个单词,就不能简单地将该单词添加到vocabulary。顺便说一句,你不需要一个单独的vocabulary列表。单独的循环不会为您带来任何好处,因此以下方法也很有效:

word_to_id = {}
counter = 0
for words in labels:
    for word in words:
        word_to_id [word] = counter
        counter += 1

通过使用^{} object^{}来提供默认值,可以大大简化代码:

from collections import defaultdict
from itertools import count

def words_to_ids(labels):
    word_ids = defaultdict(count().__next__)
    return [[word_ids[w1], word_ids[w2]] for w1, w2 in labels]

每次调用__next__时,count()对象都会给您一个序列中的下一个整数值,每次尝试访问字典中尚不存在的键时,defaultdict()都会调用该整数值。它们一起确保了每个唯一单词的唯一ID。你知道吗

相关问题 更多 >