Все перестановки Python и комбинации пиньинь (латинизация китайского языка)
Я хочу составить список бесцветных комбинаций/перестановок пиньинь.
import pandas as pd
data = pd.read_csv('chinese_tones.txt', sep=" ", header=None)
data.columns = ["pinyin", "character"]
data['pinyin'] = data['pinyin'].str.replace('\d+', '')
Текущий формат данных:
| pinyin| character|
|------|----|---|---|---|
| cang | 仓 | | | |
| cang | 藏 | | | |
| cao | 操 | | | |
| cao | 曹 | | | |
| cao | 草 | | | |
Ожидаемым результатом будет список вроде:
cangcang
cangcao
caocang
caocao
Я могу дедуплицировать список и очистить себя. Я просто пытаюсь включить каждую комбинацию в каждый порядок двух пиньинь.
1 ответ
Вы можете , а затем использовать
outer
дополнение, чтобы получить все комбинации.
import numpy as np
import pandas as pd
s = df['pinyin'].drop_duplicates().to_numpy()
pd.Series(np.add.outer(s, s).ravel())
#0 cangcang
#1 cangcao
#2 caocang
#3 caocao
#dtype: object
If you want to add back the original words just add `s` back to this outer addition.
pd.Series(s.tolist() + np.add.outer(s, s).ravel().tolist())
#0 cang
#1 cao
#2 cangcang
#3 cangcao
#4 caocang
#5 caocao
#dtype: object
Если вы также хотите иметь отдельные слова, мы можем сделать то же самое с помощью слияния вместо того, чтобы опускаться до numpy.
drop_duplicates
еще раз и назначьте временный ключ для выполнения всего слияния, затем добавьте строки.
s = df[['pinyin']].drop_duplicates().assign(key=1)
res = s.merge(s, on='key').drop(columns='key')
res['combined'] = res['pinyin_x'] + res['pinyin_y']
# pinyin_x pinyin_y combined
#0 cang cang cangcang
#1 cang cao cangcao
#2 cao cang caocang
#3 cao cao caocao