[英]Grouping data in a dataframe to produce lists against unique ids in Pandas/Python
[英]Produce unique ids for a list of lists with words
我有成对单词的列表列表,并想要在ids上描述单词。 Ids应该是从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]]
它是重复的ids,其中有独特的单词。
你有两个错误。 首先,你有一个简单的拼写错误,在这里:
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
您可以使用defaultdict
对象和itertools.count()
提供默认值来简化代码:
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。
有两个问题:
word_to_id
重复查找word1
来制作拼写错误。 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之前版本的替代方法是使用collections.OrderedDict
或itertools
unique_everseen
配方 。
如果没有订购要求,您可以使用set(vocabulary)
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.