File size: 6,020 Bytes
f5cf8c0 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 |
import customtkinter
import pandas as pd
# ๋ชจ๋ ํค์๋๋ฅผ ํฌํจํ๋ ํ๋ง ํํฐ๋งํ๋ ํจ์
def filter_rows_containing_all_keywords(df, keywords):
# ๋ชจ๋ ํค์๋์ ๋ํ boolean mask ์ด๊ธฐํ, df์ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉ
final_mask = pd.Series([True] * len(df), index=df.index)
# ๊ฐ ํค์๋์ ๋ํด DataFrame์ ๋ชจ๋ ์ด์ ๊ฒ์ฌํ๊ณ boolean mask ์์ฑ ๋ฐ ์ ์ฅ
for keyword in keywords:
keyword_mask = pd.Series([False] * len(df), index=df.index)
for column in ['copyright', 'character', 'artist', 'meta', 'general']:
if df[column].dtype == 'object':
keyword_mask |= df[column].str.contains(keyword, na=False)
final_mask &= keyword_mask
return df[final_mask]
def filter_rows_not_containing_all_keywords(df, keywords):
# ๋ชจ๋ ํค์๋๋ฅผ ํฌํจํ์ง ์๋ ํ์ ํํฐ๋งํ๊ธฐ ์ํ boolean mask ์ด๊ธฐํ, df์ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉ
final_mask = pd.Series([True] * len(df), index=df.index)
# ๊ฐ ํค์๋์ ๋ํด DataFrame์ ๋ชจ๋ ์ด์ ๊ฒ์ฌํ๊ณ boolean mask ์์ฑ ๋ฐ ์ ์ฅ
for keyword in keywords:
keyword_mask = pd.Series([False] * len(df), index=df.index)
for column in ['copyright', 'character', 'artist', 'meta', 'general']:
if df[column].dtype == 'object':
keyword_mask |= df[column].str.contains(keyword, na=False)
# ๋ชจ๋ ํค์๋๋ฅผ ํฌํจํ๋ ํ์ ๋ํ mask๋ฅผ ๋ฐ์ ์์ผ final_mask์ ์ ์ฅ
final_mask &= ~keyword_mask
return df[final_mask]
def process_asterisk_group(df, asterisk_group):
# ๊ฐ ํค์๋ ์์ '*'๋ฅผ ์ ๊ฑฐํ๊ณ ๋งจ ๋ค์ ',' ์ถ๊ฐ
asterisk_keywords = [keyword.lstrip('*') + ',' for keyword in asterisk_group]
# ๊ฐ ํ์ ๋ํด ์์ ๋ฌธ์์ด search_string์ ๋ง๋ค๊ณ ๊ฒ์ ์ํ
df['search_string'] = df[['copyright', 'character', 'artist', 'meta', 'general']].apply(lambda x: ' ' + ', '.join(x.astype(str)) + ',', axis=1)
for keyword in asterisk_keywords:
df = df[df['search_string'].str.contains(keyword, na=False)]
df.drop('search_string', axis=1, inplace=True)
return df
def process_perfect_negative_group(df, perfect_negative_group):
# ๊ฐ ํค์๋ ์์ '~'๋ฅผ ์ ๊ฑฐํ๊ณ ๋งจ ๋ค์ ',' ์ถ๊ฐ
perfect_negative_keywords = [keyword.lstrip('~') + ',' for keyword in perfect_negative_group]
# ๊ฐ ํ์ ๋ํด ์์ ๋ฌธ์์ด search_string์ ๋ง๋ฆ
df['search_string'] = df[['copyright', 'character', 'artist', 'meta', 'general']].apply(lambda x: ' ' + ', '.join(x.astype(str)) + ',', axis=1)
# ๋ชจ๋ ํค์๋์ ๋ํ ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ํ๋์ boolean Series๋ก ๊ฒฐํฉ
combined_mask = pd.Series([True] * len(df), index=df.index)
for keyword in perfect_negative_keywords:
keyword_mask = df['search_string'].str.contains(keyword, na=False)
combined_mask &= ~keyword_mask
# ์ต์ข
์ ์ผ๋ก ์ผ์นํ์ง ์๋ ํ๋ง ํํฐ๋ง
df = df[combined_mask]
# search_string ์ด ์ ๊ฑฐ
df.drop('search_string', axis=1, inplace=True)
return df
def search(df, search_request, exclude_request, E, N, S, G):
if(E == 0):
df = df[~(df['rating'] == 'e')]
if(N == 0):
df = df[~(df['rating'] == 'q')]
if(S == 0):
df = df[~(df['rating'] == 's')]
if(G == 0):
df = df[~(df['rating'] == 'g')]
if(len(df) == 0):
return None
#search_request์ ๋ํ ์ฒ๋ฆฌ
#์ฒ๋ฆฌ์์ normal -> curly -> asterisk
split_requests = [item.strip() for item in search_request.split(',')]
curly_brace_group = [item for item in split_requests if item.startswith('{') and item.endswith('}')]
asterisk_group = [item for item in split_requests if item.startswith('*')]
normal_group = [item for item in split_requests if item not in curly_brace_group + asterisk_group]
negative_split_requests = [item.strip() for item in exclude_request.split(',')]
perfect_negative_group = [item for item in negative_split_requests if item.startswith('~')]
negative_group = [item for item in negative_split_requests if item not in perfect_negative_group]
if '' in split_requests:
split_requests.remove('')
if '' in negative_split_requests:
negative_split_requests.remove('')
#ํฌ์งํฐ๋ธ
if split_requests:
#normal ์ฒ๋ฆฌ
if normal_group:
df = filter_rows_containing_all_keywords(df, normal_group)
if(len(df) == 0):
return None
#OR ์ฒ๋ฆฌ
if curly_brace_group:
for keyword in curly_brace_group:
or_search_keyword = [item.strip() for item in keyword[1:-1].split('|')]
results = pd.DataFrame()
for keyword in or_search_keyword:
if keyword.startswith('*'):
keyword = keyword[1:]
for column in ['copyright', 'character', 'artist', 'meta', 'general']:
matched_rows = df[df[column].str.contains(keyword, na=False)]
if not matched_rows.empty:
results = pd.concat([results, matched_rows])
break
del[[df]]
df = results.copy()
del[[results]]
if(len(df) == 0):
return None
#Perfect Matching ์ฒ๋ฆฌ
if asterisk_group:
df = process_asterisk_group(df,asterisk_group)
if(len(df) == 0):
return None
#Exclude ์ฒ๋ฆฌ
if negative_split_requests:
if negative_group:
df = filter_rows_not_containing_all_keywords(df, negative_group)
if(len(df) == 0):
return None
if perfect_negative_group:
df = process_perfect_negative_group(df, perfect_negative_group)
if(len(df) == 0):
return None
return df
|