# hw4 report ###### tags: `AI2023` --- ### 了解資料 #### read data ```python=22 path = 'data/' df = pd.read_csv(path + 'train.csv') ``` #### features (training set only) * profile pic:⽤戶有沒有頭貼 ```python=30 # check feature 'profile pic' print(set(df['profile pic'])) # value: 0/1 print(df.loc[(df['profile pic'] == 0) & (df['fake'] == 0)]) # count: 2 print(df.loc[(df['profile pic'] == 0) & (df['fake'] == 1)]) # count: 170 print(df.loc[(df['profile pic'] == 1) & (df['fake'] == 0)]) # count: 286 print(df.loc[(df['profile pic'] == 1) & (df['fake'] == 1)]) # count: 118 ``` * value: 0 or 1 | | value = 0 | value = 1 | | -----------: | :-------: | :-------: | | **not fake** | 2 | 286 | | **is fake** | 170 | 118 | * 大部分沒有頭貼的用戶為假帳號 * nums/length username:帳戶名稱中數字所佔⽐例 ```python=37 # check feature 'nums/length username' lst = list(set(df['nums/length username'])) lst = sorted(lst, key=float) print(lst) cnt_n_fake = [] cnt_fake = [] for i in lst: cnt_n_fake.append(len(df.loc[(df['nums/length username'] == i) & (df['fake'] == 0)])) cnt_fake.append(len(df.loc[(df['nums/length username'] == i) & (df['fake'] == 1)])) print(cnt_n_fake, cnt_fake) lst = [str(i) for i in lst] plt.figure(figsize=(12, 7)) bar1 = plt.bar(lst, cnt_n_fake) bar2 = plt.bar(lst, cnt_fake, bottom=cnt_n_fake, color='red') plt.xticks(rotation = 90) plt.xlabel('value') plt.ylabel('count') plt.legend([bar1, bar2], ['not fake', 'is fake']) plt.show() ``` * value: floating points 0~1 ![圖片](https://hackmd.io/_uploads/rJZVh_VH6.png) * 帳戶名稱中數字所佔⽐例越高,是假帳號的比例就越高 * fullname words:⽤戶名稱單詞數 ```python=59 # check feature 'fullname words' lst = list(set(df['fullname words'])) print(lst) cnt_n_fake = [] cnt_fake = [] for i in lst: cnt_n_fake.append(len(df.loc[(df['fullname words'] == i) & (df['fake'] == 0)])) cnt_fake.append(len(df.loc[(df['fullname words'] == i) & (df['fake'] == 1)])) print(cnt_n_fake, cnt_fake) lst = [str(i) for i in lst] bar1 = plt.bar(lst, cnt_n_fake) bar2 = plt.bar(lst, cnt_fake, bottom=cnt_n_fake, color='red') plt.xlabel('value') plt.ylabel('count') plt.legend([bar1, bar2], ['not fake', 'is fake']) plt.show() ``` * value: integer ![圖片](https://hackmd.io/_uploads/HyWRhdNST.png) * nums/length fullname:⽤戶名稱中數字所佔⽐例 ```python=78 # check feature 'nums/length fullname' lst = list(set(df['nums/length fullname'])) lst = sorted(lst, key = float) print(lst) cnt_n_fake = [] cnt_fake = [] for i in lst: cnt_n_fake.append(len(df.loc[(df['nums/length fullname'] == i) & (df['fake'] == 0)])) cnt_fake.append(len(df.loc[(df['nums/length fullname'] == i) & (df['fake'] == 1)])) print(cnt_n_fake, cnt_fake) lst = [str(i) for i in lst] plt.figure(figsize=(12, 7)) bar1 = plt.bar(lst, cnt_n_fake) bar2 = plt.bar(lst, cnt_fake, bottom=cnt_n_fake, color='red') plt.xticks(rotation = 90) plt.xlabel('value') plt.ylabel('count') plt.legend([bar1, bar2], ['not fake', 'is fake']) plt.show() ``` * value: floating points 0~1 ![圖片](https://hackmd.io/_uploads/S18I6_Era.png) * name==username:帳戶名稱與⽤戶名稱是否⼀致 ```python=100 # check feature 'name==username' print(set(df['name==username'])) # value: 0/1 print(df.loc[(df['name==username'] == 0) & (df['fake'] == 0)]) # count: 287 print(df.loc[(df['name==username'] == 0) & (df['fake'] == 1)]) # count: 269 print(df.loc[(df['name==username'] == 1) & (df['fake'] == 0)]) # count: 1 print(df.loc[(df['name==username'] == 1) & (df['fake'] == 1)]) # count: 19 ``` * value: 0 or 1 | | value = 0 | value = 1 | | -----------: | :-------: | :-------: | | **not fake** | 287 | 1 | | **is fake** | 269 | 19 | * description length:⾃介⻑度 ```python=107 # check feature 'description length' lst = list(set(df['description length'])) print(lst) lst = np.arange(151) # max description length cnt_n_fake = [] cnt_fake = [] for i in lst: cnt_n_fake.append(len(df.loc[(df['description length'] == i) & (df['fake'] == 0)])) cnt_fake.append(len(df.loc[(df['description length'] == i) & (df['fake'] == 1)])) print(cnt_n_fake, cnt_fake) plt.figure(figsize=(12, 7)) plt.plot(lst, cnt_n_fake) plt.plot(lst, cnt_fake, color='red') plt.xlabel('value') plt.ylabel('count') plt.legend(['not fake', 'is fake']) plt.show() ``` * value: integer ![圖片](https://hackmd.io/_uploads/r1bYrcNrp.png) * 假帳號的自介長度大多為 0 * external URL:是否有外部網址 ```python=127 # check feature 'external URL' print(set(df['external URL'])) # value: 0/1 print(df.loc[(df['external URL'] == 0) & (df['fake'] == 0)]) # count: 221 print(df.loc[(df['external URL'] == 0) & (df['fake'] == 1)]) # count: 288 print(df.loc[(df['external URL'] == 1) & (df['fake'] == 0)]) # count: 67 print(df.loc[(df['external URL'] == 1) & (df['fake'] == 1)]) # count: 0 ``` * value: 0 or 1 | | value = 0 | value = 1 | | -----------: | :-------: | :-------: | | **not fake** | 221 | 67 | | **is fake** | 288 | 0 | * 有外部網址的帳號皆不是假帳號 * private:是否為私⼈帳號 ```python=134 # check feature 'private' print(set(df['private'])) # value: 0/1 print(df.loc[(df['private'] == 0) & (df['fake'] == 0)]) # count: 174 print(df.loc[(df['private'] == 0) & (df['fake'] == 1)]) # count: 182 print(df.loc[(df['private'] == 1) & (df['fake'] == 0)]) # count: 114 print(df.loc[(df['private'] == 1) & (df['fake'] == 1)]) # count: 106 ``` * value: 0 or 1 | | value = 0 | value = 1 | | -----------: | :-------: | :-------: | | **not fake** | 174 | 114 | | **is fake** | 182 | 106 | * 是否為私⼈帳號與是否為假帳號直接相關性不大 * #posts:有幾則貼⽂ ```python=141 # check feature '#posts' lst = list(set(df['#posts'])) lst = sorted(lst) lst = lst[0:146] # the last non-zero value in cnt_fake: index 145 print(lst) cnt_n_fake = [] cnt_fake = [] for i in lst: cnt_n_fake.append(len(df.loc[(df['#posts'] == i) & (df['fake'] == 0)])) cnt_fake.append(len(df.loc[(df['#posts'] == i) & (df['fake'] == 1)])) print(cnt_n_fake, cnt_fake) # find the last non-zero value in cnt_fake # for i, value in enumerate(cnt_fake): # if value == 1: # print(i) plt.figure(figsize=(12, 7)) plt.plot(lst, cnt_n_fake) plt.plot(lst, cnt_fake, color='red') plt.xlabel('value') plt.ylabel('count') plt.legend(['not fake', 'is fake']) plt.show() ``` * value: integer ![圖片](https://hackmd.io/_uploads/B1H2_qVBa.png) * value > 300 (index > 145 in `lst`) 的皆不是假帳號 * 貼⽂數越多,是假帳號的比例越少 * #followers:粉絲數 ```python=167 # check feature '#followers' lst = list(set(df['#followers'])) lst = sorted(lst) lst = lst[0:322] # the last non-zero value in cnt_fake: index 321 print(lst) cnt_n_fake = [] cnt_fake = [] for i in lst: cnt_n_fake.append(len(df.loc[(df['#followers'] == i) & (df['fake'] == 0)])) cnt_fake.append(len(df.loc[(df['#followers'] == i) & (df['fake'] == 1)])) print(cnt_n_fake, cnt_fake) # find the last non-zero value in cnt_fake # for i, value in enumerate(cnt_fake): # if value == 1: # print(i) lst = [str(i) for i in lst] plt.figure(figsize=(20, 7)) bar1 = plt.bar(lst, cnt_n_fake) bar2 = plt.bar(lst, cnt_fake, bottom=cnt_n_fake, color='red') plt.xticks(np.arange(0, 360, 20)) plt.yticks(np.arange(0, 20)) plt.xlabel('value') plt.ylabel('count') plt.legend([bar1, bar2], ['not fake', 'is fake']) plt.show() ``` * value: integer ![圖片](https://hackmd.io/_uploads/ryQHAqEBp.png) * value > 3500 (index > 321 in `lst`) 的皆不是假帳號 * 粉絲數越多,是假帳號的比例越少 * #follows:追蹤⼈數 ```python=196 # check feature '#follows' lst = list(set(df['#follows'])) lst = sorted(lst) print(lst) cnt_n_fake = [] cnt_fake = [] for i in lst: cnt_n_fake.append(len(df.loc[(df['#follows'] == i) & (df['fake'] == 0)])) cnt_fake.append(len(df.loc[(df['#follows'] == i) & (df['fake'] == 1)])) print(cnt_n_fake, cnt_fake) lst = [str(i) for i in lst] plt.figure(figsize=(20, 7)) bar1 = plt.bar(lst, cnt_n_fake) bar2 = plt.bar(lst, cnt_fake, bottom=cnt_n_fake, color='red') plt.xticks(np.arange(0, 418, 19)) plt.yticks(np.arange(0, 13)) plt.xlabel('value') plt.ylabel('count') plt.legend([bar1, bar2], ['not fake', 'is fake']) plt.show() ``` * value: integer ![圖片](https://hackmd.io/_uploads/B10nJoNrp.png) * 追蹤⼈數越多,是假帳號的比例越少 * fake:是否為假帳號 ```python=25 # check feature 'fake' print(set(df['fake'])) # value: 0/1 print(df.loc[df['fake'] == 0]) # count: 288 print(df.loc[df['fake'] == 1]) # count: 288 ``` * value: 0 or 1 * count: 各 288 筆 --- ### 前處理 ```python=222 import math # Discretization # 為具有連續數值的 features 設定邊界 # 邊界數值之設定是根據上個 section 的觀察結果 discret = { 'nums/length username': [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1], 'fullname words': [0, 1, 2, 3, 5, math.inf], 'nums/length fullname': [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1], 'description length': [0, 1, 20, 40, 60, 80, 100, math.inf], '#posts': [0, 1, 10, 20, 30, 40, 50, 100, 200, 300, math.inf], '#followers': [0, 20, 40, 60, 80, 100, 150, 200, 300, 500, 1000, math.inf], '#follows': [0, 20, 40, 60, 80, 100, 150, 200, 300, 500, 1000, math.inf] } ``` * 為具有連續的數值的 features 設定離散區間的邊界,使之得以轉換成離散型資料 * 邊界數值之設定是根據上個 section 的觀察結果而定 * 數值為 floating points 0~1 的 features,如:'nums/length username' 與 'nums/length fullname',將其區間邊界設定為每 0.1 一個 step * 數值為 integer 的 features,則根據該 feature 的數值對應是否為假帳號的分布圖(即上個 section 中的折線圖與長條圖),來決定區間邊界數值 --- ### 建⽴模型 * 定義一些常數以便利用 ```python=240 # constants p = df.loc[df['fake'] == 1].shape[0] n = df.loc[df['fake'] == 0].shape[0] features = [ 'profile pic', 'nums/length username', 'fullname words', 'nums/length fullname', 'name==username', 'description length', 'external URL', 'private', '#posts', '#followers', '#follows' ] ``` * 根據定義實作一些 helper functions ```python=257 def entropy(prob): if prob == 0 or prob == 1: # boundary value return 0 else: return -(prob * math.log2(prob) + (1-prob) * math.log2(1-prob)) def remainder(feature): lst = list(set(df[feature])) lst = sorted(lst, key=type(lst[0])) sum = 0 if feature in discret.keys(): for i in range(len(discret[feature])-1): p_k = df.loc[(df[feature] >= discret[feature][i]) & (df[feature] < discret[feature][i+1]) & (df['fake'] == 1)].shape[0] n_k = df.loc[(df[feature] >= discret[feature][i]) & (df[feature] < discret[feature][i+1]) & (df['fake'] == 0)].shape[0] if p_k == 0 and n_k == 0: continue sum += (p_k + n_k) / (p + n) * entropy(p_k / (p_k + n_k)) else: for i in lst: p_k = df.loc[(df[feature] == i) & (df['fake'] == 1)].shape[0] n_k = df.loc[(df[feature] == i) & (df['fake'] == 0)].shape[0] sum += (p_k + n_k) / (p + n) * entropy(p_k / (p_k + n_k)) return sum def GAIN(feature): return entropy(p / (p + n)) - remainder(feature) ``` * `entropy(prob)` * 傳入 0~1 的 probability 數值 * 回傳值即為根據以下公式計算所得的值 ![圖片](https://hackmd.io/_uploads/SyZE03rST.png) * `remainder(feature)` * 傳入 feature 名稱,則可以計算出該 feature 的 remainder 數值,公式如下 ![圖片](https://hackmd.io/_uploads/SJnpRnBHa.png) * 因為離散型資料與連續型資料的取值邏輯不同,故分成兩個 cases,但計算的方式都是依照公式定義,即 line 274、line 279 * `GAIN(feature)` * 傳入 feature 名稱,則可以計算出該 feature 的 information gain 數值,公式如下 ![圖片](https://hackmd.io/_uploads/HyI7g6BSp.png) * 根據定義實作 decision tree learning 演算法 ```python=286 def DT(df, feature, df_parent): if df.shape[0] == 0: return 1 if (df_parent.loc[df_parent['fake'] == 1].shape[0] > df_parent.loc[df_parent['fake'] == 1].shape[0]) else 0 elif df.loc[df['fake'] == 1].shape[0] == 0: return 0 elif df.loc[df['fake'] == 0].shape[0] == 0: return 1 elif len(feature) == 0: return 1 if (df.loc[df['fake'] == 1].shape[0] > df.loc[df['fake'] == 1].shape[0]) else 0 else: gain = [] for i in feature: gain.append(GAIN(i)) index = gain.index(max(gain)) root = feature[index] # print(gain, index, root) tree = { root: {} } if root in discret.keys(): for i in range(len(discret[root])-1): df_child = df.loc[(df[root] >= discret[root][i]) & (df[root] < discret[root][i+1])] subtree = DT(df_child, feature[:index] + feature[index+1:], df) tree[root][i] = subtree else: lst = list(set(df[root])) lst = sorted(lst, key=type(lst[0])) for i in lst: df_child = df.loc[df[root] == i] subtree = DT(df_child, feature[:index] + feature[index+1:], df) tree[root][i] = subtree return tree ``` * 最終生成的 tree 格式為 python dictionary 格式,結構範例如下 ``` { feature1: { v_1: { feature2: { ... } }, v_2: { feature4: { ... } }, ..., v_k: { ... } } } ``` * build model and store model ```python=319 # build model tree = DT(df, features, df) # store model import json with open("tree.json", "w") as outfile: json.dump(tree, outfile) ``` --- ### 優化 * 驗證模型 ```python=335 # verify model test = pd.read_csv(path + 'test.csv') correctness = [] correctness_fake = [] correctness_n_fake = [] for i in range(test.shape[0]): target = test.iloc[i] result = tree while not (result == 0 or result == 1): feature = list(result.keys())[0] if feature in discret.keys(): for i in range(len(discret[feature])-1): if discret[feature][i] <= target[feature] and target[feature] < discret[feature][i+1]: result = result[feature][str(i)] break else: lst = list(set(df[feature])) lst = sorted(lst, key=type(lst[0])) for i in lst: if target[feature] == i: try: result = result[feature][str(i)] except: result = 1 correctness.append(target['fake'] == result) if target['fake'] == 1: correctness_fake.append(target['fake'] == result) else: correctness_n_fake.append(target['fake'] == result) print('accuracy: {}'.format(correctness.count(True) / len(correctness))) print('accuracy_fake: {}'.format(correctness_fake.count(True) / len(correctness_fake))) print('accuracy_n_fake: {}'.format(correctness_n_fake.count(True) / len(correctness_n_fake))) ``` * accuracy = 0.759, accuracy_fake = 0.567, accuracy_n_fake = 0.95 * 根據觀察可以發現模型有 overfitting 的問題,例如:line 353~357 是為了處理在 overfitting to training set 的模型中無法判斷的 test case * 嘗試 1:可以透過剪去較長的分枝,將決策規則變得更完整,同時減少 overfitting 的問題 * accuracy = 0.775, accuracy_fake = 0.583, accuracy_n_fake = 0.967 * 準確度有微幅上升,但對於假帳號的辨別能力仍然不足 * 嘗試 2:調整資料離散化的區間,重新訓練模型 * 將離散化的區間擴大,以避免細分成太多不必要分支(以下為調整後的區間,在前處理的 section 呈現的是調整前的區間) ```python=227 discret = { 'nums/length username': [0, 0.1, 0.2, 0.3, 0.4, 0.5, 1], 'fullname words': [0, 1, 3, 5, math.inf], 'nums/length fullname': [0, 0.1, 0.2, 0.3, 0.4, 0.5, 1], 'description length': [0, 1, 50, 100, math.inf], '#posts': [0, 1, 10, 30, 50, 100, 200, 300, math.inf], '#followers': [0, 100, 300, 500, 1000, math.inf], '#follows': [0, 100, 300, 500, 1000, math.inf] } ``` * accuracy = 0.858, accuracy_fake = 0.783, accuracy_n_fake = 0.933 --- ### 解釋 * 視覺化決策樹 ```python=372 # visualize the tree from treelib import Node, Tree import os root = Tree() def print_tree(label, t): if t == 0 or t == 1: root.create_node(t, parent=label) return feature = list(t.keys())[0] if feature in discret.keys(): for i in range(len(discret[feature])-1): name = '{} <= {} < {}'.format(discret[feature][i], feature, discret[feature][i+1]) root.create_node(name, label + name, parent=label) print_tree(label + name, t[feature][str(i)]) else: lst = list(set(df[feature])) lst = sorted(lst, key=type(lst[0])) for i in lst: if not str(i) in t[feature].keys(): continue name = '{} = {}'.format(feature, i) root.create_node(name, label + name, parent=label) print_tree(label + name, t[feature][str(i)]) root.create_node('Root', 'root') print_tree('root', tree) root.show() # store visualized tree if os.path.exists('tree.txt'): os.remove('tree.txt') root.save2file('tree.txt') ``` * 如同 section 1 的分析,主要判斷是否為假帳號的依據為自介長度、追蹤⼈數、粉絲數、貼⽂數等特徵 * 樹狀圖 ``` Root ├── 0 <= #posts < 1 │ ├── 0 <= #followers < 100 │ │ ├── profile pic = 0 │ │ │ └── 1 │ │ └── profile pic = 1 │ │ ├── 0 <= nums/length username < 0.1 │ │ │ ├── 0 <= description length < 1 │ │ │ │ ├── 0 <= #follows < 100 │ │ │ │ │ └── external URL = 0 │ │ │ │ │ ├── 0 <= nums/length fullname < 0.1 │ │ │ │ │ │ ├── name==username = 0 │ │ │ │ │ │ │ ├── 0 <= fullname words < 1 │ │ │ │ │ │ │ │ └── 0 │ │ │ │ │ │ │ ├── 1 <= fullname words < 3 │ │ │ │ │ │ │ │ ├── private = 0 │ │ │ │ │ │ │ │ │ └── 0 │ │ │ │ │ │ │ │ └── private = 1 │ │ │ │ │ │ │ │ └── 0 │ │ │ │ │ │ │ ├── 3 <= fullname words < 5 │ │ │ │ │ │ │ │ └── 0 │ │ │ │ │ │ │ └── 5 <= fullname words < inf │ │ │ │ │ │ │ └── 0 │ │ │ │ │ │ └── name==username = 1 │ │ │ │ │ │ └── 1 │ │ │ │ │ ├── 0.1 <= nums/length fullname < 0.2 │ │ │ │ │ │ └── 0 │ │ │ │ │ ├── 0.2 <= nums/length fullname < 0.3 │ │ │ │ │ │ └── 0 │ │ │ │ │ ├── 0.3 <= nums/length fullname < 0.4 │ │ │ │ │ │ └── 0 │ │ │ │ │ ├── 0.4 <= nums/length fullname < 0.5 │ │ │ │ │ │ └── 0 │ │ │ │ │ └── 0.5 <= nums/length fullname < 1 │ │ │ │ │ └── 0 │ │ │ │ ├── 100 <= #follows < 300 │ │ │ │ │ └── 1 │ │ │ │ ├── 1000 <= #follows < inf │ │ │ │ │ └── 0 │ │ │ │ ├── 300 <= #follows < 500 │ │ │ │ │ └── 0 │ │ │ │ └── 500 <= #follows < 1000 │ │ │ │ └── 0 │ │ │ ├── 1 <= description length < 50 │ │ │ │ └── 1 │ │ │ ├── 100 <= description length < inf │ │ │ │ └── 0 │ │ │ └── 50 <= description length < 100 │ │ │ └── 0 │ │ ├── 0.1 <= nums/length username < 0.2 │ │ │ └── 1 │ │ ├── 0.2 <= nums/length username < 0.3 │ │ │ └── 1 │ │ ├── 0.3 <= nums/length username < 0.4 │ │ │ └── 1 │ │ ├── 0.4 <= nums/length username < 0.5 │ │ │ └── 1 │ │ └── 0.5 <= nums/length username < 1 │ │ └── 1 │ ├── 100 <= #followers < 300 │ │ ├── profile pic = 0 │ │ │ └── 1 │ │ └── profile pic = 1 │ │ └── 0 │ ├── 1000 <= #followers < inf │ │ └── 1 │ ├── 300 <= #followers < 500 │ │ └── 1 │ └── 500 <= #followers < 1000 │ └── 0 ├── 1 <= #posts < 10 │ ├── 0 <= #followers < 100 │ │ ├── profile pic = 0 │ │ │ └── 1 │ │ └── profile pic = 1 │ │ ├── 0 <= nums/length username < 0.1 │ │ │ ├── 0 <= description length < 1 │ │ │ │ ├── 0 <= #follows < 100 │ │ │ │ │ └── external URL = 0 │ │ │ │ │ ├── 0 <= nums/length fullname < 0.1 │ │ │ │ │ │ ├── name==username = 0 │ │ │ │ │ │ │ ├── 0 <= fullname words < 1 │ │ │ │ │ │ │ │ └── 1 │ │ │ │ │ │ │ ├── 1 <= fullname words < 3 │ │ │ │ │ │ │ │ ├── private = 0 │ │ │ │ │ │ │ │ │ └── 0 │ │ │ │ │ │ │ │ └── private = 1 │ │ │ │ │ │ │ │ └── 0 │ │ │ │ │ │ │ ├── 3 <= fullname words < 5 │ │ │ │ │ │ │ │ └── 0 │ │ │ │ │ │ │ └── 5 <= fullname words < inf │ │ │ │ │ │ │ └── 0 │ │ │ │ │ │ └── name==username = 1 │ │ │ │ │ │ └── 1 │ │ │ │ │ ├── 0.1 <= nums/length fullname < 0.2 │ │ │ │ │ │ └── 0 │ │ │ │ │ ├── 0.2 <= nums/length fullname < 0.3 │ │ │ │ │ │ └── 0 │ │ │ │ │ ├── 0.3 <= nums/length fullname < 0.4 │ │ │ │ │ │ └── 0 │ │ │ │ │ ├── 0.4 <= nums/length fullname < 0.5 │ │ │ │ │ │ └── 0 │ │ │ │ │ └── 0.5 <= nums/length fullname < 1 │ │ │ │ │ └── 0 │ │ │ │ ├── 100 <= #follows < 300 │ │ │ │ │ └── external URL = 0 │ │ │ │ │ ├── 0 <= nums/length fullname < 0.1 │ │ │ │ │ │ └── name==username = 0 │ │ │ │ │ │ ├── 0 <= fullname words < 1 │ │ │ │ │ │ │ └── 0 │ │ │ │ │ │ ├── 1 <= fullname words < 3 │ │ │ │ │ │ │ ├── private = 0 │ │ │ │ │ │ │ │ └── 1 │ │ │ │ │ │ │ └── private = 1 │ │ │ │ │ │ │ └── 0 │ │ │ │ │ │ ├── 3 <= fullname words < 5 │ │ │ │ │ │ │ └── 0 │ │ │ │ │ │ └── 5 <= fullname words < inf │ │ │ │ │ │ └── 0 │ │ │ │ │ ├── 0.1 <= nums/length fullname < 0.2 │ │ │ │ │ │ └── 0 │ │ │ │ │ ├── 0.2 <= nums/length fullname < 0.3 │ │ │ │ │ │ └── 0 │ │ │ │ │ ├── 0.3 <= nums/length fullname < 0.4 │ │ │ │ │ │ └── 0 │ │ │ │ │ ├── 0.4 <= nums/length fullname < 0.5 │ │ │ │ │ │ └── 0 │ │ │ │ │ └── 0.5 <= nums/length fullname < 1 │ │ │ │ │ └── 0 │ │ │ │ ├── 1000 <= #follows < inf │ │ │ │ │ └── 0 │ │ │ │ ├── 300 <= #follows < 500 │ │ │ │ │ └── 0 │ │ │ │ └── 500 <= #follows < 1000 │ │ │ │ └── 0 │ │ │ ├── 1 <= description length < 50 │ │ │ │ ├── 0 <= #follows < 100 │ │ │ │ │ └── external URL = 0 │ │ │ │ │ ├── 0 <= nums/length fullname < 0.1 │ │ │ │ │ │ └── name==username = 0 │ │ │ │ │ │ ├── 0 <= fullname words < 1 │ │ │ │ │ │ │ └── 1 │ │ │ │ │ │ ├── 1 <= fullname words < 3 │ │ │ │ │ │ │ ├── private = 0 │ │ │ │ │ │ │ │ └── 1 │ │ │ │ │ │ │ └── private = 1 │ │ │ │ │ │ │ └── 0 │ │ │ │ │ │ ├── 3 <= fullname words < 5 │ │ │ │ │ │ │ └── 0 │ │ │ │ │ │ └── 5 <= fullname words < inf │ │ │ │ │ │ └── 0 │ │ │ │ │ ├── 0.1 <= nums/length fullname < 0.2 │ │ │ │ │ │ └── 0 │ │ │ │ │ ├── 0.2 <= nums/length fullname < 0.3 │ │ │ │ │ │ └── 0 │ │ │ │ │ ├── 0.3 <= nums/length fullname < 0.4 │ │ │ │ │ │ └── 0 │ │ │ │ │ ├── 0.4 <= nums/length fullname < 0.5 │ │ │ │ │ │ └── 0 │ │ │ │ │ └── 0.5 <= nums/length fullname < 1 │ │ │ │ │ └── 0 │ │ │ │ ├── 100 <= #follows < 300 │ │ │ │ │ └── external URL = 0 │ │ │ │ │ ├── 0 <= nums/length fullname < 0.1 │ │ │ │ │ │ └── name==username = 0 │ │ │ │ │ │ ├── 0 <= fullname words < 1 │ │ │ │ │ │ │ └── 0 │ │ │ │ │ │ ├── 1 <= fullname words < 3 │ │ │ │ │ │ │ └── 0 │ │ │ │ │ │ ├── 3 <= fullname words < 5 │ │ │ │ │ │ │ └── 1 │ │ │ │ │ │ └── 5 <= fullname words < inf │ │ │ │ │ │ └── 0 │ │ │ │ │ ├── 0.1 <= nums/length fullname < 0.2 │ │ │ │ │ │ └── 0 │ │ │ │ │ ├── 0.2 <= nums/length fullname < 0.3 │ │ │ │ │ │ └── 0 │ │ │ │ │ ├── 0.3 <= nums/length fullname < 0.4 │ │ │ │ │ │ └── 0 │ │ │ │ │ ├── 0.4 <= nums/length fullname < 0.5 │ │ │ │ │ │ └── 0 │ │ │ │ │ └── 0.5 <= nums/length fullname < 1 │ │ │ │ │ └── 0 │ │ │ │ ├── 1000 <= #follows < inf │ │ │ │ │ └── 0 │ │ │ │ ├── 300 <= #follows < 500 │ │ │ │ │ └── 0 │ │ │ │ └── 500 <= #follows < 1000 │ │ │ │ └── 0 │ │ │ ├── 100 <= description length < inf │ │ │ │ └── 0 │ │ │ └── 50 <= description length < 100 │ │ │ └── 0 │ │ ├── 0.1 <= nums/length username < 0.2 │ │ │ ├── 0 <= description length < 1 │ │ │ │ ├── 0 <= #follows < 100 │ │ │ │ │ └── external URL = 0 │ │ │ │ │ ├── 0 <= nums/length fullname < 0.1 │ │ │ │ │ │ └── name==username = 0 │ │ │ │ │ │ ├── 0 <= fullname words < 1 │ │ │ │ │ │ │ └── 1 │ │ │ │ │ │ ├── 1 <= fullname words < 3 │ │ │ │ │ │ │ ├── private = 0 │ │ │ │ │ │ │ │ └── 0 │ │ │ │ │ │ │ └── private = 1 │ │ │ │ │ │ │ └── 1 │ │ │ │ │ │ ├── 3 <= fullname words < 5 │ │ │ │ │ │ │ └── 0 │ │ │ │ │ │ └── 5 <= fullname words < inf │ │ │ │ │ │ └── 0 │ │ │ │ │ ├── 0.1 <= nums/length fullname < 0.2 │ │ │ │ │ │ └── 0 │ │ │ │ │ ├── 0.2 <= nums/length fullname < 0.3 │ │ │ │ │ │ └── 0 │ │ │ │ │ ├── 0.3 <= nums/length fullname < 0.4 │ │ │ │ │ │ └── 0 │ │ │ │ │ ├── 0.4 <= nums/length fullname < 0.5 │ │ │ │ │ │ └── 0 │ │ │ │ │ └── 0.5 <= nums/length fullname < 1 │ │ │ │ │ └── 0 │ │ │ │ ├── 100 <= #follows < 300 │ │ │ │ │ └── external URL = 0 │ │ │ │ │ ├── 0 <= nums/length fullname < 0.1 │ │ │ │ │ │ └── name==username = 0 │ │ │ │ │ │ ├── 0 <= fullname words < 1 │ │ │ │ │ │ │ └── 0 │ │ │ │ │ │ ├── 1 <= fullname words < 3 │ │ │ │ │ │ │ └── private = 1 │ │ │ │ │ │ │ └── 0 │ │ │ │ │ │ ├── 3 <= fullname words < 5 │ │ │ │ │ │ │ └── 0 │ │ │ │ │ │ └── 5 <= fullname words < inf │ │ │ │ │ │ └── 0 │ │ │ │ │ ├── 0.1 <= nums/length fullname < 0.2 │ │ │ │ │ │ └── 0 │ │ │ │ │ ├── 0.2 <= nums/length fullname < 0.3 │ │ │ │ │ │ └── 0 │ │ │ │ │ ├── 0.3 <= nums/length fullname < 0.4 │ │ │ │ │ │ └── 0 │ │ │ │ │ ├── 0.4 <= nums/length fullname < 0.5 │ │ │ │ │ │ └── 0 │ │ │ │ │ └── 0.5 <= nums/length fullname < 1 │ │ │ │ │ └── 0 │ │ │ │ ├── 1000 <= #follows < inf │ │ │ │ │ └── 0 │ │ │ │ ├── 300 <= #follows < 500 │ │ │ │ │ └── 0 │ │ │ │ └── 500 <= #follows < 1000 │ │ │ │ └── 0 │ │ │ ├── 1 <= description length < 50 │ │ │ │ └── 1 │ │ │ ├── 100 <= description length < inf │ │ │ │ └── 0 │ │ │ └── 50 <= description length < 100 │ │ │ └── 1 │ │ ├── 0.2 <= nums/length username < 0.3 │ │ │ └── 1 │ │ ├── 0.3 <= nums/length username < 0.4 │ │ │ ├── 0 <= description length < 1 │ │ │ │ ├── 0 <= #follows < 100 │ │ │ │ │ └── 1 │ │ │ │ ├── 100 <= #follows < 300 │ │ │ │ │ └── 0 │ │ │ │ ├── 1000 <= #follows < inf │ │ │ │ │ └── 0 │ │ │ │ ├── 300 <= #follows < 500 │ │ │ │ │ └── 0 │ │ │ │ └── 500 <= #follows < 1000 │ │ │ │ └── 0 │ │ │ ├── 1 <= description length < 50 │ │ │ │ └── 1 │ │ │ ├── 100 <= description length < inf │ │ │ │ └── 0 │ │ │ └── 50 <= description length < 100 │ │ │ └── 0 │ │ ├── 0.4 <= nums/length username < 0.5 │ │ │ └── 1 │ │ └── 0.5 <= nums/length username < 1 │ │ └── 1 │ ├── 100 <= #followers < 300 │ │ ├── profile pic = 0 │ │ │ └── 1 │ │ └── profile pic = 1 │ │ ├── 0 <= nums/length username < 0.1 │ │ │ └── 0 │ │ ├── 0.1 <= nums/length username < 0.2 │ │ │ ├── 0 <= description length < 1 │ │ │ │ ├── 0 <= #follows < 100 │ │ │ │ │ └── 0 │ │ │ │ ├── 100 <= #follows < 300 │ │ │ │ │ └── 1 │ │ │ │ ├── 1000 <= #follows < inf │ │ │ │ │ └── 0 │ │ │ │ ├── 300 <= #follows < 500 │ │ │ │ │ └── 0 │ │ │ │ └── 500 <= #follows < 1000 │ │ │ │ └── 0 │ │ │ ├── 1 <= description length < 50 │ │ │ │ └── 0 │ │ │ ├── 100 <= description length < inf │ │ │ │ └── 0 │ │ │ └── 50 <= description length < 100 │ │ │ └── 0 │ │ ├── 0.2 <= nums/length username < 0.3 │ │ │ ├── 0 <= description length < 1 │ │ │ │ ├── 0 <= #follows < 100 │ │ │ │ │ └── 0 │ │ │ │ ├── 100 <= #follows < 300 │ │ │ │ │ └── 0 │ │ │ │ ├── 1000 <= #follows < inf │ │ │ │ │ └── 0 │ │ │ │ ├── 300 <= #follows < 500 │ │ │ │ │ └── external URL = 0 │ │ │ │ │ ├── 0 <= nums/length fullname < 0.1 │ │ │ │ │ │ └── name==username = 0 │ │ │ │ │ │ ├── 0 <= fullname words < 1 │ │ │ │ │ │ │ └── 0 │ │ │ │ │ │ ├── 1 <= fullname words < 3 │ │ │ │ │ │ │ ├── private = 0 │ │ │ │ │ │ │ │ └── 1 │ │ │ │ │ │ │ └── private = 1 │ │ │ │ │ │ │ └── 0 │ │ │ │ │ │ ├── 3 <= fullname words < 5 │ │ │ │ │ │ │ └── 0 │ │ │ │ │ │ └── 5 <= fullname words < inf │ │ │ │ │ │ └── 0 │ │ │ │ │ ├── 0.1 <= nums/length fullname < 0.2 │ │ │ │ │ │ └── 0 │ │ │ │ │ ├── 0.2 <= nums/length fullname < 0.3 │ │ │ │ │ │ └── 0 │ │ │ │ │ ├── 0.3 <= nums/length fullname < 0.4 │ │ │ │ │ │ └── 0 │ │ │ │ │ ├── 0.4 <= nums/length fullname < 0.5 │ │ │ │ │ │ └── 0 │ │ │ │ │ └── 0.5 <= nums/length fullname < 1 │ │ │ │ │ └── 0 │ │ │ │ └── 500 <= #follows < 1000 │ │ │ │ └── 0 │ │ │ ├── 1 <= description length < 50 │ │ │ │ └── 1 │ │ │ ├── 100 <= description length < inf │ │ │ │ └── 0 │ │ │ └── 50 <= description length < 100 │ │ │ └── 0 │ │ ├── 0.3 <= nums/length username < 0.4 │ │ │ ├── 0 <= description length < 1 │ │ │ │ └── 1 │ │ │ ├── 1 <= description length < 50 │ │ │ │ └── 0 │ │ │ ├── 100 <= description length < inf │ │ │ │ └── 0 │ │ │ └── 50 <= description length < 100 │ │ │ └── 0 │ │ ├── 0.4 <= nums/length username < 0.5 │ │ │ └── 1 │ │ └── 0.5 <= nums/length username < 1 │ │ └── 1 │ ├── 1000 <= #followers < inf │ │ └── profile pic = 1 │ │ ├── 0 <= nums/length username < 0.1 │ │ │ └── 0 │ │ ├── 0.1 <= nums/length username < 0.2 │ │ │ └── 0 │ │ ├── 0.2 <= nums/length username < 0.3 │ │ │ ├── 0 <= description length < 1 │ │ │ │ └── 0 │ │ │ ├── 1 <= description length < 50 │ │ │ │ └── 1 │ │ │ ├── 100 <= description length < inf │ │ │ │ └── 0 │ │ │ └── 50 <= description length < 100 │ │ │ └── 0 │ │ ├── 0.3 <= nums/length username < 0.4 │ │ │ └── 0 │ │ ├── 0.4 <= nums/length username < 0.5 │ │ │ └── 0 │ │ └── 0.5 <= nums/length username < 1 │ │ └── 0 │ ├── 300 <= #followers < 500 │ │ ├── profile pic = 0 │ │ │ └── 1 │ │ └── profile pic = 1 │ │ ├── 0 <= nums/length username < 0.1 │ │ │ ├── 0 <= description length < 1 │ │ │ │ ├── 0 <= #follows < 100 │ │ │ │ │ └── 0 │ │ │ │ ├── 100 <= #follows < 300 │ │ │ │ │ └── 0 │ │ │ │ ├── 1000 <= #follows < inf │ │ │ │ │ └── 0 │ │ │ │ ├── 300 <= #follows < 500 │ │ │ │ │ └── 0 │ │ │ │ └── 500 <= #follows < 1000 │ │ │ │ └── 1 │ │ │ ├── 1 <= description length < 50 │ │ │ │ └── 0 │ │ │ ├── 100 <= description length < inf │ │ │ │ └── 0 │ │ │ └── 50 <= description length < 100 │ │ │ └── 0 │ │ ├── 0.1 <= nums/length username < 0.2 │ │ │ └── 0 │ │ ├── 0.2 <= nums/length username < 0.3 │ │ │ └── 0 │ │ ├── 0.3 <= nums/length username < 0.4 │ │ │ └── 0 │ │ ├── 0.4 <= nums/length username < 0.5 │ │ │ └── 0 │ │ └── 0.5 <= nums/length username < 1 │ │ └── 0 │ └── 500 <= #followers < 1000 │ ├── profile pic = 0 │ │ └── 1 │ └── profile pic = 1 │ ├── 0 <= nums/length username < 0.1 │ │ └── 0 │ ├── 0.1 <= nums/length username < 0.2 │ │ └── 0 │ ├── 0.2 <= nums/length username < 0.3 │ │ └── 1 │ ├── 0.3 <= nums/length username < 0.4 │ │ ├── 0 <= description length < 1 │ │ │ └── 0 │ │ ├── 1 <= description length < 50 │ │ │ └── 0 │ │ ├── 100 <= description length < inf │ │ │ └── 0 │ │ └── 50 <= description length < 100 │ │ └── 1 │ ├── 0.4 <= nums/length username < 0.5 │ │ └── 0 │ └── 0.5 <= nums/length username < 1 │ └── 0 ├── 10 <= #posts < 30 │ ├── 0 <= #followers < 100 │ │ ├── profile pic = 0 │ │ │ └── 1 │ │ └── profile pic = 1 │ │ ├── 0 <= nums/length username < 0.1 │ │ │ ├── 0 <= description length < 1 │ │ │ │ ├── 0 <= #follows < 100 │ │ │ │ │ └── external URL = 0 │ │ │ │ │ ├── 0 <= nums/length fullname < 0.1 │ │ │ │ │ │ └── name==username = 0 │ │ │ │ │ │ ├── 0 <= fullname words < 1 │ │ │ │ │ │ │ └── private = 1 │ │ │ │ │ │ │ └── 0 │ │ │ │ │ │ ├── 1 <= fullname words < 3 │ │ │ │ │ │ │ └── 0 │ │ │ │ │ │ ├── 3 <= fullname words < 5 │ │ │ │ │ │ │ └── 0 │ │ │ │ │ │ └── 5 <= fullname words < inf │ │ │ │ │ │ └── 0 │ │ │ │ │ ├── 0.1 <= nums/length fullname < 0.2 │ │ │ │ │ │ └── 0 │ │ │ │ │ ├── 0.2 <= nums/length fullname < 0.3 │ │ │ │ │ │ └── 0 │ │ │ │ │ ├── 0.3 <= nums/length fullname < 0.4 │ │ │ │ │ │ └── 0 │ │ │ │ │ ├── 0.4 <= nums/length fullname < 0.5 │ │ │ │ │ │ └── 0 │ │ │ │ │ └── 0.5 <= nums/length fullname < 1 │ │ │ │ │ └── 0 │ │ │ │ ├── 100 <= #follows < 300 │ │ │ │ │ └── 0 │ │ │ │ ├── 1000 <= #follows < inf │ │ │ │ │ └── 0 │ │ │ │ ├── 300 <= #follows < 500 │ │ │ │ │ └── 0 │ │ │ │ └── 500 <= #follows < 1000 │ │ │ │ └── 0 │ │ │ ├── 1 <= description length < 50 │ │ │ │ ├── 0 <= #follows < 100 │ │ │ │ │ └── external URL = 0 │ │ │ │ │ ├── 0 <= nums/length fullname < 0.1 │ │ │ │ │ │ └── name==username = 0 │ │ │ │ │ │ ├── 0 <= fullname words < 1 │ │ │ │ │ │ │ └── 0 │ │ │ │ │ │ ├── 1 <= fullname words < 3 │ │ │ │ │ │ │ └── private = 1 │ │ │ │ │ │ │ └── 0 │ │ │ │ │ │ ├── 3 <= fullname words < 5 │ │ │ │ │ │ │ └── 0 │ │ │ │ │ │ └── 5 <= fullname words < inf │ │ │ │ │ │ └── 0 │ │ │ │ │ ├── 0.1 <= nums/length fullname < 0.2 │ │ │ │ │ │ └── 0 │ │ │ │ │ ├── 0.2 <= nums/length fullname < 0.3 │ │ │ │ │ │ └── 0 │ │ │ │ │ ├── 0.3 <= nums/length fullname < 0.4 │ │ │ │ │ │ └── 0 │ │ │ │ │ ├── 0.4 <= nums/length fullname < 0.5 │ │ │ │ │ │ └── 0 │ │ │ │ │ └── 0.5 <= nums/length fullname < 1 │ │ │ │ │ └── 0 │ │ │ │ ├── 100 <= #follows < 300 │ │ │ │ │ └── 0 │ │ │ │ ├── 1000 <= #follows < inf │ │ │ │ │ └── 0 │ │ │ │ ├── 300 <= #follows < 500 │ │ │ │ │ └── 0 │ │ │ │ └── 500 <= #follows < 1000 │ │ │ │ └── 0 │ │ │ ├── 100 <= description length < inf │ │ │ │ └── 0 │ │ │ └── 50 <= description length < 100 │ │ │ └── 0 │ │ ├── 0.1 <= nums/length username < 0.2 │ │ │ ├── 0 <= description length < 1 │ │ │ │ ├── 0 <= #follows < 100 │ │ │ │ │ └── 1 │ │ │ │ ├── 100 <= #follows < 300 │ │ │ │ │ └── 0 │ │ │ │ ├── 1000 <= #follows < inf │ │ │ │ │ └── 0 │ │ │ │ ├── 300 <= #follows < 500 │ │ │ │ │ └── 0 │ │ │ │ └── 500 <= #follows < 1000 │ │ │ │ └── 0 │ │ │ ├── 1 <= description length < 50 │ │ │ │ └── 0 │ │ │ ├── 100 <= description length < inf │ │ │ │ └── 0 │ │ │ └── 50 <= description length < 100 │ │ │ └── 0 │ │ ├── 0.2 <= nums/length username < 0.3 │ │ │ └── 1 │ │ ├── 0.3 <= nums/length username < 0.4 │ │ │ └── 1 │ │ ├── 0.4 <= nums/length username < 0.5 │ │ │ └── 0 │ │ └── 0.5 <= nums/length username < 1 │ │ └── 1 │ ├── 100 <= #followers < 300 │ │ ├── profile pic = 0 │ │ │ ├── 0 <= nums/length username < 0.1 │ │ │ │ ├── 0 <= description length < 1 │ │ │ │ │ └── 1 │ │ │ │ ├── 1 <= description length < 50 │ │ │ │ │ └── 0 │ │ │ │ ├── 100 <= description length < inf │ │ │ │ │ └── 0 │ │ │ │ └── 50 <= description length < 100 │ │ │ │ └── 0 │ │ │ ├── 0.1 <= nums/length username < 0.2 │ │ │ │ └── 0 │ │ │ ├── 0.2 <= nums/length username < 0.3 │ │ │ │ └── 0 │ │ │ ├── 0.3 <= nums/length username < 0.4 │ │ │ │ └── 1 │ │ │ ├── 0.4 <= nums/length username < 0.5 │ │ │ │ └── 0 │ │ │ └── 0.5 <= nums/length username < 1 │ │ │ └── 0 │ │ └── profile pic = 1 │ │ ├── 0 <= nums/length username < 0.1 │ │ │ ├── 0 <= description length < 1 │ │ │ │ ├── 0 <= #follows < 100 │ │ │ │ │ └── 0 │ │ │ │ ├── 100 <= #follows < 300 │ │ │ │ │ └── 0 │ │ │ │ ├── 1000 <= #follows < inf │ │ │ │ │ └── 0 │ │ │ │ ├── 300 <= #follows < 500 │ │ │ │ │ └── external URL = 0 │ │ │ │ │ ├── 0 <= nums/length fullname < 0.1 │ │ │ │ │ │ └── name==username = 0 │ │ │ │ │ │ ├── 0 <= fullname words < 1 │ │ │ │ │ │ │ └── 0 │ │ │ │ │ │ ├── 1 <= fullname words < 3 │ │ │ │ │ │ │ └── 0 │ │ │ │ │ │ ├── 3 <= fullname words < 5 │ │ │ │ │ │ │ └── 1 │ │ │ │ │ │ └── 5 <= fullname words < inf │ │ │ │ │ │ └── 0 │ │ │ │ │ ├── 0.1 <= nums/length fullname < 0.2 │ │ │ │ │ │ └── 0 │ │ │ │ │ ├── 0.2 <= nums/length fullname < 0.3 │ │ │ │ │ │ └── 0 │ │ │ │ │ ├── 0.3 <= nums/length fullname < 0.4 │ │ │ │ │ │ └── 0 │ │ │ │ │ ├── 0.4 <= nums/length fullname < 0.5 │ │ │ │ │ │ └── 0 │ │ │ │ │ └── 0.5 <= nums/length fullname < 1 │ │ │ │ │ └── 0 │ │ │ │ └── 500 <= #follows < 1000 │ │ │ │ └── 1 │ │ │ ├── 1 <= description length < 50 │ │ │ │ └── 0 │ │ │ ├── 100 <= description length < inf │ │ │ │ └── 0 │ │ │ └── 50 <= description length < 100 │ │ │ └── 0 │ │ ├── 0.1 <= nums/length username < 0.2 │ │ │ └── 0 │ │ ├── 0.2 <= nums/length username < 0.3 │ │ │ └── 0 │ │ ├── 0.3 <= nums/length username < 0.4 │ │ │ ├── 0 <= description length < 1 │ │ │ │ ├── 0 <= #follows < 100 │ │ │ │ │ └── 0 │ │ │ │ ├── 100 <= #follows < 300 │ │ │ │ │ └── 0 │ │ │ │ ├── 1000 <= #follows < inf │ │ │ │ │ └── 0 │ │ │ │ ├── 300 <= #follows < 500 │ │ │ │ │ └── external URL = 0 │ │ │ │ │ ├── 0 <= nums/length fullname < 0.1 │ │ │ │ │ │ └── name==username = 0 │ │ │ │ │ │ ├── 0 <= fullname words < 1 │ │ │ │ │ │ │ └── 0 │ │ │ │ │ │ ├── 1 <= fullname words < 3 │ │ │ │ │ │ │ └── 1 │ │ │ │ │ │ ├── 3 <= fullname words < 5 │ │ │ │ │ │ │ └── 0 │ │ │ │ │ │ └── 5 <= fullname words < inf │ │ │ │ │ │ └── 0 │ │ │ │ │ ├── 0.1 <= nums/length fullname < 0.2 │ │ │ │ │ │ └── 0 │ │ │ │ │ ├── 0.2 <= nums/length fullname < 0.3 │ │ │ │ │ │ └── 0 │ │ │ │ │ ├── 0.3 <= nums/length fullname < 0.4 │ │ │ │ │ │ └── 0 │ │ │ │ │ ├── 0.4 <= nums/length fullname < 0.5 │ │ │ │ │ │ └── 0 │ │ │ │ │ └── 0.5 <= nums/length fullname < 1 │ │ │ │ │ └── 0 │ │ │ │ └── 500 <= #follows < 1000 │ │ │ │ └── 0 │ │ │ ├── 1 <= description length < 50 │ │ │ │ └── 0 │ │ │ ├── 100 <= description length < inf │ │ │ │ └── 0 │ │ │ └── 50 <= description length < 100 │ │ │ └── 0 │ │ ├── 0.4 <= nums/length username < 0.5 │ │ │ └── 1 │ │ └── 0.5 <= nums/length username < 1 │ │ └── 1 │ ├── 1000 <= #followers < inf │ │ └── profile pic = 1 │ │ ├── 0 <= nums/length username < 0.1 │ │ │ └── 1 │ │ ├── 0.1 <= nums/length username < 0.2 │ │ │ └── 0 │ │ ├── 0.2 <= nums/length username < 0.3 │ │ │ └── 0 │ │ ├── 0.3 <= nums/length username < 0.4 │ │ │ └── 0 │ │ ├── 0.4 <= nums/length username < 0.5 │ │ │ └── 0 │ │ └── 0.5 <= nums/length username < 1 │ │ └── 0 │ ├── 300 <= #followers < 500 │ │ └── profile pic = 1 │ │ ├── 0 <= nums/length username < 0.1 │ │ │ ├── 0 <= description length < 1 │ │ │ │ └── 0 │ │ │ ├── 1 <= description length < 50 │ │ │ │ └── 0 │ │ │ ├── 100 <= description length < inf │ │ │ │ └── 1 │ │ │ └── 50 <= description length < 100 │ │ │ └── 0 │ │ ├── 0.1 <= nums/length username < 0.2 │ │ │ └── 0 │ │ ├── 0.2 <= nums/length username < 0.3 │ │ │ └── 1 │ │ ├── 0.3 <= nums/length username < 0.4 │ │ │ └── 1 │ │ ├── 0.4 <= nums/length username < 0.5 │ │ │ └── 0 │ │ └── 0.5 <= nums/length username < 1 │ │ └── 1 │ └── 500 <= #followers < 1000 │ └── profile pic = 1 │ ├── 0 <= nums/length username < 0.1 │ │ ├── 0 <= description length < 1 │ │ │ ├── 0 <= #follows < 100 │ │ │ │ └── 0 │ │ │ ├── 100 <= #follows < 300 │ │ │ │ └── 0 │ │ │ ├── 1000 <= #follows < inf │ │ │ │ └── external URL = 0 │ │ │ │ ├── 0 <= nums/length fullname < 0.1 │ │ │ │ │ └── name==username = 0 │ │ │ │ │ ├── 0 <= fullname words < 1 │ │ │ │ │ │ └── 0 │ │ │ │ │ ├── 1 <= fullname words < 3 │ │ │ │ │ │ └── private = 0 │ │ │ │ │ │ └── 0 │ │ │ │ │ ├── 3 <= fullname words < 5 │ │ │ │ │ │ └── 0 │ │ │ │ │ └── 5 <= fullname words < inf │ │ │ │ │ └── 0 │ │ │ │ ├── 0.1 <= nums/length fullname < 0.2 │ │ │ │ │ └── 0 │ │ │ │ ├── 0.2 <= nums/length fullname < 0.3 │ │ │ │ │ └── 0 │ │ │ │ ├── 0.3 <= nums/length fullname < 0.4 │ │ │ │ │ └── 0 │ │ │ │ ├── 0.4 <= nums/length fullname < 0.5 │ │ │ │ │ └── 0 │ │ │ │ └── 0.5 <= nums/length fullname < 1 │ │ │ │ └── 0 │ │ │ ├── 300 <= #follows < 500 │ │ │ │ └── 0 │ │ │ └── 500 <= #follows < 1000 │ │ │ └── 0 │ │ ├── 1 <= description length < 50 │ │ │ └── 0 │ │ ├── 100 <= description length < inf │ │ │ └── 0 │ │ └── 50 <= description length < 100 │ │ └── 0 │ ├── 0.1 <= nums/length username < 0.2 │ │ └── 0 │ ├── 0.2 <= nums/length username < 0.3 │ │ └── 0 │ ├── 0.3 <= nums/length username < 0.4 │ │ └── 0 │ ├── 0.4 <= nums/length username < 0.5 │ │ └── 0 │ └── 0.5 <= nums/length username < 1 │ └── 0 ├── 100 <= #posts < 200 │ ├── 0 <= #followers < 100 │ │ ├── profile pic = 0 │ │ │ └── 1 │ │ └── profile pic = 1 │ │ ├── 0 <= nums/length username < 0.1 │ │ │ └── 0 │ │ ├── 0.1 <= nums/length username < 0.2 │ │ │ └── 0 │ │ ├── 0.2 <= nums/length username < 0.3 │ │ │ └── 1 │ │ ├── 0.3 <= nums/length username < 0.4 │ │ │ └── 0 │ │ ├── 0.4 <= nums/length username < 0.5 │ │ │ └── 0 │ │ └── 0.5 <= nums/length username < 1 │ │ └── 1 │ ├── 100 <= #followers < 300 │ │ └── profile pic = 1 │ │ ├── 0 <= nums/length username < 0.1 │ │ │ ├── 0 <= description length < 1 │ │ │ │ ├── 0 <= #follows < 100 │ │ │ │ │ └── 0 │ │ │ │ ├── 100 <= #follows < 300 │ │ │ │ │ └── 0 │ │ │ │ ├── 1000 <= #follows < inf │ │ │ │ │ └── 0 │ │ │ │ ├── 300 <= #follows < 500 │ │ │ │ │ └── 0 │ │ │ │ └── 500 <= #follows < 1000 │ │ │ │ └── 1 │ │ │ ├── 1 <= description length < 50 │ │ │ │ ├── 0 <= #follows < 100 │ │ │ │ │ └── 0 │ │ │ │ ├── 100 <= #follows < 300 │ │ │ │ │ └── 0 │ │ │ │ ├── 1000 <= #follows < inf │ │ │ │ │ └── 1 │ │ │ │ ├── 300 <= #follows < 500 │ │ │ │ │ └── 0 │ │ │ │ └── 500 <= #follows < 1000 │ │ │ │ └── 0 │ │ │ ├── 100 <= description length < inf │ │ │ │ └── 0 │ │ │ └── 50 <= description length < 100 │ │ │ └── 0 │ │ ├── 0.1 <= nums/length username < 0.2 │ │ │ └── 0 │ │ ├── 0.2 <= nums/length username < 0.3 │ │ │ └── 0 │ │ ├── 0.3 <= nums/length username < 0.4 │ │ │ └── 0 │ │ ├── 0.4 <= nums/length username < 0.5 │ │ │ └── 0 │ │ └── 0.5 <= nums/length username < 1 │ │ └── 0 │ ├── 1000 <= #followers < inf │ │ └── 0 │ ├── 300 <= #followers < 500 │ │ └── 0 │ └── 500 <= #followers < 1000 │ ├── profile pic = 0 │ │ └── 0 │ └── profile pic = 1 │ ├── 0 <= nums/length username < 0.1 │ │ └── 0 │ ├── 0.1 <= nums/length username < 0.2 │ │ └── 1 │ ├── 0.2 <= nums/length username < 0.3 │ │ └── 0 │ ├── 0.3 <= nums/length username < 0.4 │ │ └── 0 │ ├── 0.4 <= nums/length username < 0.5 │ │ └── 1 │ └── 0.5 <= nums/length username < 1 │ └── 0 ├── 200 <= #posts < 300 │ ├── 0 <= #followers < 100 │ │ └── 1 │ ├── 100 <= #followers < 300 │ │ └── 0 │ ├── 1000 <= #followers < inf │ │ └── 0 │ ├── 300 <= #followers < 500 │ │ └── 0 │ └── 500 <= #followers < 1000 │ └── 0 ├── 30 <= #posts < 50 │ ├── 0 <= #followers < 100 │ │ └── profile pic = 1 │ │ ├── 0 <= nums/length username < 0.1 │ │ │ ├── 0 <= description length < 1 │ │ │ │ ├── 0 <= #follows < 100 │ │ │ │ │ └── 1 │ │ │ │ ├── 100 <= #follows < 300 │ │ │ │ │ └── 0 │ │ │ │ ├── 1000 <= #follows < inf │ │ │ │ │ └── 0 │ │ │ │ ├── 300 <= #follows < 500 │ │ │ │ │ └── 0 │ │ │ │ └── 500 <= #follows < 1000 │ │ │ │ └── 0 │ │ │ ├── 1 <= description length < 50 │ │ │ │ └── 0 │ │ │ ├── 100 <= description length < inf │ │ │ │ └── 0 │ │ │ └── 50 <= description length < 100 │ │ │ └── 0 │ │ ├── 0.1 <= nums/length username < 0.2 │ │ │ └── 0 │ │ ├── 0.2 <= nums/length username < 0.3 │ │ │ └── 0 │ │ ├── 0.3 <= nums/length username < 0.4 │ │ │ └── 1 │ │ ├── 0.4 <= nums/length username < 0.5 │ │ │ └── 0 │ │ └── 0.5 <= nums/length username < 1 │ │ └── 1 │ ├── 100 <= #followers < 300 │ │ ├── profile pic = 0 │ │ │ └── 1 │ │ └── profile pic = 1 │ │ ├── 0 <= nums/length username < 0.1 │ │ │ ├── 0 <= description length < 1 │ │ │ │ └── 1 │ │ │ ├── 1 <= description length < 50 │ │ │ │ └── 0 │ │ │ ├── 100 <= description length < inf │ │ │ │ └── 0 │ │ │ └── 50 <= description length < 100 │ │ │ └── 0 │ │ ├── 0.1 <= nums/length username < 0.2 │ │ │ └── 0 │ │ ├── 0.2 <= nums/length username < 0.3 │ │ │ └── 0 │ │ ├── 0.3 <= nums/length username < 0.4 │ │ │ └── 0 │ │ ├── 0.4 <= nums/length username < 0.5 │ │ │ └── 0 │ │ └── 0.5 <= nums/length username < 1 │ │ └── 1 │ ├── 1000 <= #followers < inf │ │ └── 0 │ ├── 300 <= #followers < 500 │ │ └── 0 │ └── 500 <= #followers < 1000 │ └── 0 ├── 300 <= #posts < inf │ └── 0 └── 50 <= #posts < 100 ├── 0 <= #followers < 100 │ └── profile pic = 1 │ ├── 0 <= nums/length username < 0.1 │ │ ├── 0 <= description length < 1 │ │ │ └── 1 │ │ ├── 1 <= description length < 50 │ │ │ └── 0 │ │ ├── 100 <= description length < inf │ │ │ └── 0 │ │ └── 50 <= description length < 100 │ │ └── 0 │ ├── 0.1 <= nums/length username < 0.2 │ │ └── 0 │ ├── 0.2 <= nums/length username < 0.3 │ │ └── 0 │ ├── 0.3 <= nums/length username < 0.4 │ │ └── 1 │ ├── 0.4 <= nums/length username < 0.5 │ │ └── 0 │ └── 0.5 <= nums/length username < 1 │ └── 0 ├── 100 <= #followers < 300 │ └── profile pic = 1 │ ├── 0 <= nums/length username < 0.1 │ │ ├── 0 <= description length < 1 │ │ │ └── 0 │ │ ├── 1 <= description length < 50 │ │ │ └── 0 │ │ ├── 100 <= description length < inf │ │ │ ├── 0 <= #follows < 100 │ │ │ │ └── 0 │ │ │ ├── 100 <= #follows < 300 │ │ │ │ ├── external URL = 0 │ │ │ │ │ ├── 0 <= nums/length fullname < 0.1 │ │ │ │ │ │ └── name==username = 0 │ │ │ │ │ │ ├── 0 <= fullname words < 1 │ │ │ │ │ │ │ └── 0 │ │ │ │ │ │ ├── 1 <= fullname words < 3 │ │ │ │ │ │ │ └── 0 │ │ │ │ │ │ ├── 3 <= fullname words < 5 │ │ │ │ │ │ │ └── 1 │ │ │ │ │ │ └── 5 <= fullname words < inf │ │ │ │ │ │ └── 0 │ │ │ │ │ ├── 0.1 <= nums/length fullname < 0.2 │ │ │ │ │ │ └── 0 │ │ │ │ │ ├── 0.2 <= nums/length fullname < 0.3 │ │ │ │ │ │ └── 0 │ │ │ │ │ ├── 0.3 <= nums/length fullname < 0.4 │ │ │ │ │ │ └── 0 │ │ │ │ │ ├── 0.4 <= nums/length fullname < 0.5 │ │ │ │ │ │ └── 0 │ │ │ │ │ └── 0.5 <= nums/length fullname < 1 │ │ │ │ │ └── 0 │ │ │ │ └── external URL = 1 │ │ │ │ └── 0 │ │ │ ├── 1000 <= #follows < inf │ │ │ │ └── 0 │ │ │ ├── 300 <= #follows < 500 │ │ │ │ └── 0 │ │ │ └── 500 <= #follows < 1000 │ │ │ └── 0 │ │ └── 50 <= description length < 100 │ │ └── 0 │ ├── 0.1 <= nums/length username < 0.2 │ │ └── 0 │ ├── 0.2 <= nums/length username < 0.3 │ │ └── 0 │ ├── 0.3 <= nums/length username < 0.4 │ │ └── 0 │ ├── 0.4 <= nums/length username < 0.5 │ │ └── 1 │ └── 0.5 <= nums/length username < 1 │ └── 0 ├── 1000 <= #followers < inf │ └── 0 ├── 300 <= #followers < 500 │ └── 0 └── 500 <= #followers < 1000 └── 0 ```