Как умножить списки слов, как векторы? - PullRequest
0 голосов
/ 06 октября 2018

У меня есть списки слов, подобных этому (здесь перечислены только 2):

list_1 = ['average', 'reasonable'] 
list_2 = ['fiddle', 'frolic']
list_n = ['etc', 'etc']

Я хочу умножить эти два списка вместе, чтобы получить ответ:

obj[l1] * obj[l2] = ['average fiddle', 'average frolic', 'reasonable fiddle', 'reasnable frolic']
obj[l1] * obj[l2] *...* obj[n]

Я написалэтот код:

import numpy as np
obj = {}
obj['l1'] = np.array(list_1)
obj['l2'] = np.array(list_2)
print(obj['l1']*obj['l2'])

Но это только дает мне ошибку:

TypeError: ufunc 'multiply' did not contain a loop with signature matching types dtype('<U10') dtype('<U10') dtype('<U10')

Что мне делать?

РЕДАКТИРОВАТЬ: Попробовал с помощью itertools, как предложил пользователь ниже:

word_list = ['fair play']
output = {'fair': ['average', 'reasonable'], 'play': ['fiddle', 'frolic']}
result = []
for words in word_list: 
    for word in word_tokenize(words): 
        list_1 = output_set[word]
        result = [(x, y) for x, y in product(list_1, result)]
        result = list(map(' '.join, result))
print(result)

Но это только возвращает пустой набор.Есть ли способ перебирать «бесконечные» списки?

Ответы [ 2 ]

0 голосов
/ 06 октября 2018

Используя itertools.product , мы можем получить их как tuples, а затем использовать ' '.join для создания str '

from itertools import product

list_1 = ['average', 'reasonable'] 
list_2 = ['fiddle', 'frolic']
list_n = ['etc', 'vash']

a = [(x, y, z) for x, y, z in product(list_1, list_2, list_n)]
a = list(map(' '.join, a))
# ['average fiddle etc', 'average fiddle vash', 'average frolic etc', 'average frolic vash', 'reasonable fiddle etc', 'reasonable fiddle vash', 'reasonable frolic etc', 'reasonable frolic vash']
0 голосов
/ 06 октября 2018

Если вы должны сделать это со списками:

In [86]: list_1 = ['average', 'reasonable'] 
    ...: list_2 = ['fiddle', 'frolic']
In [87]: arr1 = np.array(list_1, object)
In [88]: arr2 = np.array(list_2, object)
In [89]: np.add.outer(arr1, arr2)
Out[89]: 
array([['averagefiddle', 'averagefrolic'],
       ['reasonablefiddle', 'reasonablefrolic']], dtype=object)

Создавая массивы объектов, в отличие от строки dtype, я заставляю add ufunc использовать метод + строк Python,Как показывает ответ @ Sandeep, добавление строк - это соединение.Умножение строк является копией.

И с третьим массивом:

In [90]: arr3 = np.array(['etc', 'etc'], object)
In [91]: np.add.outer(np.add.outer(arr1, arr2),arr3)
Out[91]: 
array([[['averagefiddleetc', 'averagefiddleetc'],
        ['averagefrolicetc', 'averagefrolicetc']],

       [['reasonablefiddleetc', 'reasonablefiddleetc'],
        ['reasonablefrolicetc', 'reasonablefrolicetc']]], dtype=object)

Я предполагаю, что вы подразумеваете под цепочкой операций.

Лично я предпочитаю решение itashtools @ vash;numpy мало что добавляет к обработке строк в Python.

In [105]: [' '.join(x) for x in itertools.product(arr1,arr2,arr3)]
Out[105]: 
['average fiddle etc',
 'average fiddle etc',
 'average frolic etc',
 'average frolic etc',
 'reasonable fiddle etc',
 'reasonable fiddle etc',
 'reasonable frolic etc',
 'reasonable frolic etc']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...