Python Найти слова в наборе пар слов на фрейме - PullRequest
0 голосов
/ 20 февраля 2020

У меня есть набор слов

{'DNA',
 'pada',
 'yang',...}

Я пытаюсь найти, есть ли слова в наборе пар слов на следующем биграмном кадре данных

                bigramf    freq
0           (DNA, yang)      15
1          (DNA, dalam)       6
2            (DNA, ini)       5
3       (DNA, memiliki)       4
4         (DNA, unting)       4
5           (pada, DNA)       4
6        (pada, urutan)       3
7     (yang, diperoleh)       3
8         (yang, lebih)       3
9      (pada, sejumlah)       2
10          (pada, RNA)       2
11          (pada, satu)      2
12       (yang, berbeda)      2     
13          (yang, sama)      2
14       (yang, tumpang)      2

Если так, то ожидаемый результат будет выглядеть так:

yang [('lebih', 3), ('diperoleh', 3), ('berbeda', 2), ('tumpang', 2), ('sama', 2)]

DNA [('yang', 15), ('dalam', 6), ('ini', 5), ('memiliki', 4), ('unting', 4)]

pada [('DNA', 4), ('urutan', 3), ('sejumlah', 2), ('RNA', 2), ('satu', 2)]

Как мне найти ?. Может кто-нибудь может помочь? Спасибо. Любая помощь очень ценится.

Ответы [ 2 ]

1 голос
/ 20 февраля 2020

Сначала преобразуйте столбец с кортежами в новые 2 столбца (не используйте apply(pd.Series), потому что slow), затем отфильтруйте сопоставленные значения по Series.isin в boolean indexing и преобразовать GroupBy.apply значения в список кортежей:

s = {'DNA',
 'pada',
 'yang'}

df[['s', 'v']] = pd.DataFrame(df['bigramf'].tolist(), index=df.index)

s = df[df['s'].isin(s)].groupby('s')['v','freq'].apply(lambda x: list(map(tuple, x.values)))
print (s)
s
DNA     [(yang, 15), (dalam, 6), (ini, 5), (memiliki, ...
pada    [(DNA, 4), (urutan, 3), (sejumlah, 2), (RNA, 2...
yang    [(diperoleh, 3), (lebih, 3), (berbeda, 2), (sa...
dtype: object

При необходимости добавить словарь Series.to_dict:

d = s.to_dict()
print (d)
{'DNA': [('yang', 15), ('dalam', 6), ('ini', 5), ('memiliki', 4), ('unting', 4)], 
 'pada': [('DNA', 4), ('urutan', 3), ('sejumlah', 2), ('RNA', 2), ('satu', 2)], 
 'yang': [('diperoleh', 3), ('lebih', 3), ('berbeda', 2), ('sama', 2), ('tumpang', 2)]}

Другое решение с collections.defaultdict:

from collections import defaultdict

d = defaultdict(list)
for (s1, v1), f1 in df.to_numpy():
    if s1 in s:
        d[s1].append((v1, f1))

d = dict(d)
print (d)
{'DNA': [('yang', 15), ('dalam', 6), ('ini', 5), ('memiliki', 4), ('unting', 4)], 
 'pada': [('DNA', 4), ('urutan', 3), ('sejumlah', 2), ('RNA', 2), ('satu', 2)], 
 'yang': [('diperoleh', 3), ('lebih', 3), ('berbeda', 2), ('sama', 2), ('tumpang', 2)]}
0 голосов
/ 20 февраля 2020

Что я сделал для сопоставления слов

Я перебрал фрейм данных, взял каждый элемент и передал его в определение типа

def match_words(actual_word, word):
    return set(actual_word.split()).intersection(word.split())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...