<p>你有两个错误。首先,你有一个简单的打字错误,这里:</p>
<pre><code>for word1,word2 in labels:
ids.append([word_to_id [word1], word_to_id [word1]])
</code></pre>
<p>您正在添加<code>word1</code><strong>的id两次</strong>,在那里。改为更正第二个<code>word1</code>以查找<code>word2</code>。你知道吗</p>
<p>接下来,您将不测试您以前是否见过一个单词,因此对于<code>'Kleiber'</code>,您首先给它id <code>4</code>,然后在下一次迭代中用<code>6</code>覆盖该条目。您需要给出<em>唯一的</em>单词编号,而不是所有单词:</p>
<pre><code>counter = 0
for word in vocabulary:
if word not in word_to_id:
word_to_id[word] = counter
counter += 1
</code></pre>
<p>或者,如果已经列出了一个单词,就不能简单地将该单词添加到<code>vocabulary</code>。顺便说一句,你不需要一个单独的<code>vocabulary</code>列表。单独的循环不会为您带来任何好处,因此以下方法也很有效:</p>
<pre><code>word_to_id = {}
counter = 0
for words in labels:
for word in words:
word_to_id [word] = counter
counter += 1
</code></pre>
<p>通过使用<a href="https://docs.python.org/3/library/collections.html#collections.defaultdict" rel="nofollow noreferrer">^{<cd9>} object</a>和<a href="https://docs.python.org/3/library/itertools.html#itertools.count" rel="nofollow noreferrer">^{<cd10>}</a>来提供默认值,可以大大简化代码:</p>
<pre><code>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]
</code></pre>
<p>每次调用<code>__next__</code>时,<code>count()</code>对象都会给您一个序列中的下一个整数值,每次尝试访问字典中尚不存在的键时,<code>defaultdict()</code>都会调用该整数值。它们一起确保了每个唯一单词的唯一ID。你知道吗</p>