Upload 6 files
Browse files- app.py +346 -0
- articles_data.csv +3 -0
- corpus_embeddings.pickle +3 -0
- satisfaction.csv +0 -0
- sensitive_words.txt +20 -0
- topic_model.pickle +3 -0
app.py
ADDED
@@ -0,0 +1,346 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import streamlit as st
|
2 |
+
import pickle
|
3 |
+
import pandas as pd
|
4 |
+
from sentence_transformers import SentenceTransformer, util
|
5 |
+
import numpy as np
|
6 |
+
from pymongo import MongoClient
|
7 |
+
import urllib.parse
|
8 |
+
import requests
|
9 |
+
from bertopic import BERTopic
|
10 |
+
from sklearn.feature_extraction.text import TfidfVectorizer
|
11 |
+
from sklearn.metrics.pairwise import cosine_similarity
|
12 |
+
import string
|
13 |
+
import deepcut
|
14 |
+
import unicodedata
|
15 |
+
from pythainlp.util import normalize
|
16 |
+
import torch
|
17 |
+
import csv
|
18 |
+
|
19 |
+
#initial state
|
20 |
+
if 'state' not in st.session_state:
|
21 |
+
st.session_state.state = 0
|
22 |
+
if 'age' not in st.session_state:
|
23 |
+
st.session_state.age = 0
|
24 |
+
if 'weight' not in st.session_state:
|
25 |
+
st.session_state.weight = 0
|
26 |
+
if 'height' not in st.session_state:
|
27 |
+
st.session_state.height = 0
|
28 |
+
if 'gender' not in st.session_state:
|
29 |
+
st.session_state.gender = 0
|
30 |
+
if 'food_allergy' not in st.session_state:
|
31 |
+
st.session_state.food_allergy = 0
|
32 |
+
if 'drug_allergy' not in st.session_state:
|
33 |
+
st.session_state.drug_allergy = 0
|
34 |
+
if 'congentital_disease' not in st.session_state:
|
35 |
+
st.session_state.congentital_disease = 0
|
36 |
+
if 'optional_keyword' not in st.session_state:
|
37 |
+
st.session_state.optional_keyword = 0
|
38 |
+
if 'all_recommend' not in st.session_state:
|
39 |
+
st.session_state.all_recommend = None
|
40 |
+
if 'true_check' not in st.session_state:
|
41 |
+
st.session_state.true_check = None
|
42 |
+
if 'queries' not in st.session_state:
|
43 |
+
st.session_state.queries = None
|
44 |
+
if 'string_contain' not in st.session_state:
|
45 |
+
st.session_state.string_contain = False
|
46 |
+
if 'sbert_searched_df' not in st.session_state:
|
47 |
+
st.session_state.sbert_searched_df = None
|
48 |
+
if 'string_contain_df' not in st.session_state:
|
49 |
+
st.session_state.string_contain_df = None
|
50 |
+
for i in range(10):
|
51 |
+
if 'score_'+str(i+1) not in st.session_state:
|
52 |
+
st.session_state['score_'+str(i+1)] = 'NA'
|
53 |
+
|
54 |
+
def set_state(state):
|
55 |
+
st.session_state.state = state
|
56 |
+
|
57 |
+
def split_text(text):
|
58 |
+
return text.split(',')
|
59 |
+
|
60 |
+
#import data
|
61 |
+
sbert_model = SentenceTransformer('paraphrase-multilingual-mpnet-base-v2')
|
62 |
+
|
63 |
+
with open('corpus_embeddings.pickle', 'rb') as file:
|
64 |
+
corpus_embeddings = pickle.load(file)
|
65 |
+
corpus_embeddings = pd.DataFrame(corpus_embeddings)
|
66 |
+
|
67 |
+
topic_model = BERTopic.load("topic_model.pickle")
|
68 |
+
data = pd.read_csv('articles_data.csv')
|
69 |
+
data['child_topic'] = topic_model.topics_[:]
|
70 |
+
|
71 |
+
with open('sensitive_words.txt', 'r',encoding='utf-8') as file:
|
72 |
+
sensitive_words = file.read()
|
73 |
+
sensitive_words = sensitive_words.lower().replace('\n','').split(' ')
|
74 |
+
sensitive_words = list(set(sensitive_words))
|
75 |
+
|
76 |
+
#local function
|
77 |
+
def save_session_state_data(session_state_data, filename):
|
78 |
+
with open(filename, 'a', newline='', encoding='utf-8') as file:
|
79 |
+
writer = csv.DictWriter(file, fieldnames=session_state_data.keys())
|
80 |
+
if file.tell() == 0:
|
81 |
+
writer.writeheader()
|
82 |
+
writer.writerow(session_state_data)
|
83 |
+
|
84 |
+
def deepcut_tokenizer(text,sensitive_words=sensitive_words):
|
85 |
+
cleanedText = "".join([i for i in text if i not in string.punctuation]).lower()
|
86 |
+
cleanedText = normalize(unicodedata.normalize('NFKD', cleanedText).replace('\n','').replace('\r','').replace('\t','').replace('“','').replace('”','').replace('.','').replace('–','').replace('‘','').replace('’','').replace('ํา','ำ').replace('...','').replace(',','').replace( 'ี','ี'))
|
87 |
+
#cleanedText = re.sub(r'\d+', '', cleanedText)
|
88 |
+
cleanedText = deepcut.tokenize(cleanedText,custom_dict=sensitive_words)
|
89 |
+
#stopwords = list(thai_stopwords())+'EMagazine GJ international bangkok hospital'.lower().split(' ')
|
90 |
+
stopwords = 'EMagazine GJ international bangkok hospital'.lower().split(' ')
|
91 |
+
cleanedText = [i for i in cleanedText if i not in stopwords]
|
92 |
+
cleanedText = [i.replace(' ','') for i in cleanedText if len(i) != 1 and len(i) !=0]
|
93 |
+
cleanedText = ','.join(cleanedText)
|
94 |
+
return cleanedText
|
95 |
+
|
96 |
+
def personal_check(age,weight,height,gender):
|
97 |
+
|
98 |
+
#age check
|
99 |
+
if age >= 60:
|
100 |
+
age = 'ผู้สูงอายุ'
|
101 |
+
else:
|
102 |
+
age = 'ทำงาน'
|
103 |
+
|
104 |
+
#gender check
|
105 |
+
if gender == 'หญิง':
|
106 |
+
gender = 'ผู้หญิง'
|
107 |
+
else:
|
108 |
+
gender = 'ผู้ชาย'
|
109 |
+
|
110 |
+
#bmi check
|
111 |
+
height_meters = height / 100
|
112 |
+
|
113 |
+
bmi = weight / (height_meters ** 2)
|
114 |
+
|
115 |
+
if bmi >= 30:
|
116 |
+
bmi = 'อ้วนมาก'
|
117 |
+
elif bmi >= 23 and bmi <30:
|
118 |
+
bmi = 'อ้วน'
|
119 |
+
elif bmi >= 18.5 and bmi <23:
|
120 |
+
bmi = ''
|
121 |
+
else:
|
122 |
+
bmi = 'ผอม'
|
123 |
+
|
124 |
+
return age,gender,bmi
|
125 |
+
|
126 |
+
def sbert_search(queries,data,embeddiing,sbert_model=sbert_model):
|
127 |
+
|
128 |
+
index_lst = []
|
129 |
+
score_lst = []
|
130 |
+
|
131 |
+
query_embedding = sbert_model.encode(queries, convert_to_tensor=True)
|
132 |
+
hits = util.semantic_search(query_embedding, embeddiing, top_k=15)
|
133 |
+
hits = hits[0]
|
134 |
+
for hit in hits:
|
135 |
+
index_lst.append(hit['corpus_id'])
|
136 |
+
score_lst.append(hit['score'])
|
137 |
+
|
138 |
+
sbert_searched = data.iloc[index_lst]
|
139 |
+
sbert_searched['score'] = score_lst
|
140 |
+
|
141 |
+
return sbert_searched
|
142 |
+
|
143 |
+
def sbert_tfidf_search(queries,head,topic_model=topic_model,data=data,corpus_embeddings=corpus_embeddings):
|
144 |
+
|
145 |
+
similar_df = None
|
146 |
+
text_to_predict_token = deepcut_tokenizer(queries)
|
147 |
+
|
148 |
+
# Find topics
|
149 |
+
try:
|
150 |
+
similar_topics, similarity = topic_model.find_topics(text_to_predict_token, top_n=1)
|
151 |
+
except:
|
152 |
+
similar_topics, similarity = topic_model.find_topics(queries, top_n=1)
|
153 |
+
|
154 |
+
# Example DataFrame
|
155 |
+
similar_df = data[data['child_topic'] == similar_topics[0]]
|
156 |
+
|
157 |
+
# TF-IDF vectorizer
|
158 |
+
vectorizer = TfidfVectorizer(tokenizer=lambda x: x, lowercase=False)
|
159 |
+
tfidf_matrix = vectorizer.fit_transform(similar_df['text_token'])
|
160 |
+
|
161 |
+
# TF-IDF vector for input text
|
162 |
+
text_tfidf = vectorizer.transform([text_to_predict_token])
|
163 |
+
|
164 |
+
# Compute cosine similarity
|
165 |
+
similarity_scores = cosine_similarity(tfidf_matrix, text_tfidf)
|
166 |
+
|
167 |
+
# Add similarity scores to DataFrame
|
168 |
+
similar_df['score'] = similarity_scores
|
169 |
+
|
170 |
+
similar_df = similar_df.sort_values('score', ascending=False).head(15)
|
171 |
+
|
172 |
+
select_corpus = corpus_embeddings.iloc[similar_df.index.sort_values()]
|
173 |
+
similar_embedding = torch.tensor(select_corpus.values)
|
174 |
+
similar_searched = sbert_search(queries,similar_df,similar_embedding)
|
175 |
+
sbert_searched = sbert_search(queries,data,torch.tensor(corpus_embeddings.values))
|
176 |
+
combined_searched = pd.concat([similar_searched,sbert_searched])
|
177 |
+
output = combined_searched.sort_values('score', ascending=False).head(head)
|
178 |
+
|
179 |
+
return output
|
180 |
+
|
181 |
+
def string_contain_search(queries,sample,data=data):
|
182 |
+
data['all_content'] = data['title']+data['content']
|
183 |
+
return data[data['all_content'].str.contains(queries,na=False)].sample(sample)
|
184 |
+
|
185 |
+
#main
|
186 |
+
def main():
|
187 |
+
#header
|
188 |
+
st.markdown("<h1 style='text-align: center; color: black;'>---ระบบแนะนำบทความสุขภาพ---</h1>", unsafe_allow_html=True)
|
189 |
+
st.subheader("ให้คะแนนบทความหน่อยนะครับ😄")
|
190 |
+
|
191 |
+
with st.form('user_info'):
|
192 |
+
|
193 |
+
#personal information input
|
194 |
+
age = st.slider("อายุ", 10, 100, 25)
|
195 |
+
|
196 |
+
col1, col2 = st.columns(2)
|
197 |
+
with col1:
|
198 |
+
weight = st.number_input("น้ำหนัก (Kg.): ",30.0,120.0,step=1.0,value=50.0)
|
199 |
+
with col2:
|
200 |
+
height = st.number_input("ส่วนสูง (cm.): ",100.0,250.0,step=1.0,value=150.0)
|
201 |
+
|
202 |
+
col3, col4, col5 = st.columns(3)
|
203 |
+
with col3:
|
204 |
+
gender = st.selectbox('เพศ',('ชาย', 'หญิง'))
|
205 |
+
with col4:
|
206 |
+
food_allergy = st.selectbox('แพ้อาหาร?',('ไม่แพ้', 'แพ้อาหาร'))
|
207 |
+
with col5:
|
208 |
+
drug_allergy = st.selectbox('แพ้ยา?',('ไม่แพ้', 'แพ้ยา'))
|
209 |
+
congentital_disease = st.text_input('โรคประจำตัวของคุณ (ถ้าหากไม่มี ไม่ต้องกรอก หรือใส่ "ไม่มี")')
|
210 |
+
optional_keyword = st.text_input('คำค้นหาเพิ่มเติม (ถ้ามี)')
|
211 |
+
|
212 |
+
st.form_submit_button(on_click=set_state,args=(1,))
|
213 |
+
|
214 |
+
if st.session_state.state == 1:
|
215 |
+
|
216 |
+
#asign state
|
217 |
+
st.session_state.age = age
|
218 |
+
st.session_state.weight = weight
|
219 |
+
st.session_state.height = height
|
220 |
+
st.session_state.gender = gender
|
221 |
+
st.session_state.food_allergy = food_allergy
|
222 |
+
st.session_state.drug_allergy = drug_allergy
|
223 |
+
st.session_state.congentital_disease = congentital_disease
|
224 |
+
st.session_state.optional_keyword = optional_keyword
|
225 |
+
|
226 |
+
#algorithm
|
227 |
+
age,gender,bmi = personal_check(age,weight,height,gender)
|
228 |
+
|
229 |
+
if food_allergy == 'ไม่แพ้':
|
230 |
+
food_allergy = ''
|
231 |
+
if drug_allergy == 'ไม่แพ้':
|
232 |
+
drug_allergy = ''
|
233 |
+
if congentital_disease == 'ไม่มี':
|
234 |
+
congentital_disease = ''
|
235 |
+
if congentital_disease != '' or optional_keyword != '':
|
236 |
+
queries = optional_keyword+congentital_disease
|
237 |
+
else:
|
238 |
+
queries = gender+age+bmi+food_allergy+drug_allergy+congentital_disease+optional_keyword
|
239 |
+
|
240 |
+
#Bertopic search
|
241 |
+
try:
|
242 |
+
sbert_searched = sbert_tfidf_search(queries,5)
|
243 |
+
string_contain = string_contain_search(queries,5)
|
244 |
+
all_recommend = pd.concat([sbert_searched,string_contain])
|
245 |
+
all_recommend = all_recommend.drop_duplicates(subset=['url'])
|
246 |
+
|
247 |
+
if len(all_recommend) != 10:
|
248 |
+
for i in range(3):
|
249 |
+
if len(all_recommend) < 10:
|
250 |
+
all_recommend = None
|
251 |
+
sbert_searched = sbert_tfidf_search(queries,5+i+1)
|
252 |
+
sbert_searched = sbert_searched.head(5)
|
253 |
+
string_contain = string_contain_search(queries,5+i+1)
|
254 |
+
string_contain = string_contain.head(5)
|
255 |
+
all_recommend = pd.concat([sbert_searched,string_contain])
|
256 |
+
all_recommend = all_recommend.drop_duplicates(subset=['url'])
|
257 |
+
|
258 |
+
st.session_state.sbert_searched_df = sbert_searched
|
259 |
+
st.session_state.string_contain_df = string_contain
|
260 |
+
st.session_state.string_contain = True
|
261 |
+
|
262 |
+
except:
|
263 |
+
sbert_searched = sbert_tfidf_search(queries,10)
|
264 |
+
st.session_state.sbert_searched_df = sbert_searched
|
265 |
+
all_recommend = sbert_searched
|
266 |
+
|
267 |
+
st.session_state.all_recommend = all_recommend
|
268 |
+
st.session_state.queries = queries
|
269 |
+
st.session_state.state = 2
|
270 |
+
|
271 |
+
if st.session_state.state == 2:
|
272 |
+
placeholder = st.empty()
|
273 |
+
|
274 |
+
#satisfaction
|
275 |
+
with placeholder.form('Satisfaction Survey'):
|
276 |
+
st.markdown("<h1 style='text-align: center; color: black;'>📰บทความสำหรับคุณ😆</h1>", unsafe_allow_html=True)
|
277 |
+
st.header("ระดับความเกี่ยวข้อง")
|
278 |
+
st.write("😞 หมายถึง ไม่เกี่ยวข้องเลย")
|
279 |
+
st.write("🙁 หมายถึง เกี่ยวข้องเล็กน้อย")
|
280 |
+
st.write("😐 หมายถึง เฉยๆ")
|
281 |
+
st.write("🙂 หมายถึง ค่อนข้างเกี่ยวข้อง")
|
282 |
+
st.write("😀 หมายถึง เกี่ยวข้องมากที่สุด")
|
283 |
+
st.write("---------------------------------------------------------------------------------------")
|
284 |
+
|
285 |
+
for i in range(len(st.session_state.all_recommend)):
|
286 |
+
st.header(str(i+1)+'. '+st.session_state.all_recommend.iloc[i]['title'])
|
287 |
+
st.markdown(f"[Page source (Click here.)]({st.session_state.all_recommend.iloc[i].url})")
|
288 |
+
|
289 |
+
try:
|
290 |
+
banner_url = urllib.parse.quote(st.session_state.all_recommend.iloc[i]['banner'], safe=':/')
|
291 |
+
response = requests.get(banner_url)
|
292 |
+
st.image(response.content)
|
293 |
+
except:
|
294 |
+
st.image('https://icon-library.com/images/no-photo-icon/no-photo-icon-1.jpg')
|
295 |
+
|
296 |
+
#satisfaction survey
|
297 |
+
st.subheader("Satisfaction Survey")
|
298 |
+
st.write("บทความที่แนะนำเกี่ยวข้องกับคุณมากเพียงใด")
|
299 |
+
st.radio('ระดับความพึงพอใจ',['NA','😞','🙁','😐','🙂','😀'],horizontal=True,key='score_'+str(i+1))
|
300 |
+
st.write("---------------------------------------------------------------------------------------")
|
301 |
+
|
302 |
+
if st.form_submit_button("ยืนยันการส่งคำตอบ"):
|
303 |
+
# Check if all articles have satisfaction levels selected
|
304 |
+
st.session_state.true_check = []
|
305 |
+
for satis_val in [st.session_state[i] for i in ['score_' + str(i+1) for i in range(10)]]:
|
306 |
+
if satis_val != 'NA':
|
307 |
+
st.session_state.true_check.append(True)
|
308 |
+
else:
|
309 |
+
st.session_state.true_check.append(False)
|
310 |
+
|
311 |
+
if np.all(st.session_state.true_check):
|
312 |
+
st.session_state.state = 3
|
313 |
+
placeholder.empty()
|
314 |
+
|
315 |
+
else:
|
316 |
+
idx = []
|
317 |
+
for i in range(len(st.session_state.true_check)):
|
318 |
+
if st.session_state.true_check[i] == False:
|
319 |
+
idx.append(i+1)
|
320 |
+
article_indexes = ', '.join(map(str, idx))
|
321 |
+
st.warning(f":red[กรุณาให้คะแนนบทความที่ {article_indexes} ด้วยครับ]")
|
322 |
+
|
323 |
+
if st.session_state.state == 3:
|
324 |
+
st.success('บันทึกคำตอบแล้ว')
|
325 |
+
|
326 |
+
st.session_state.all_recommend = st.session_state.all_recommend.to_dict(orient='records')
|
327 |
+
if st.session_state.sbert_searched_df is not None:
|
328 |
+
st.session_state.sbert_searched_df = st.session_state.sbert_searched_df.to_dict(orient='records')
|
329 |
+
if st.session_state.string_contain_df is not None:
|
330 |
+
st.session_state.string_contain_df = st.session_state.string_contain_df.to_dict(orient='records')
|
331 |
+
|
332 |
+
try:
|
333 |
+
save_session_state_data(st.session_state.to_dict(), 'satisfaction.csv')
|
334 |
+
|
335 |
+
except:
|
336 |
+
#database insertion
|
337 |
+
client = MongoClient('mongodb://192.168.1.103:27017/')
|
338 |
+
database = client['test']
|
339 |
+
collection = database['satisfy_articles']
|
340 |
+
collection.insert_one(st.session_state.to_dict())
|
341 |
+
|
342 |
+
finally:
|
343 |
+
st.session_state.state = 0
|
344 |
+
|
345 |
+
if __name__ == "__main__":
|
346 |
+
main()
|
articles_data.csv
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:482450aaf532318d1070b88f96f2f196116672fbc221b4b07a72a30db2b55c07
|
3 |
+
size 111917370
|
corpus_embeddings.pickle
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:df1b3b8a5bbcb56feefb6fc9f10377ca717a161fa4a45358f66c3266f9c05e93
|
3 |
+
size 14656907
|
satisfaction.csv
ADDED
The diff for this file is too large to render.
See raw diff
|
|
sensitive_words.txt
ADDED
@@ -0,0 +1,20 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
วิตามินบี1 วิตามินบี2 วิตามินบี3 วิตามินบี5 วิตามินบี6 วิตามินบี7 วิตามินบี9 วิตามินบี12 วิตามินเอ วิตามินดี วิตามินอี วิตามินเค
|
2 |
+
วิตามินซี โอเมก้า3 โอเมก้า6 โอเมก้า9 VitaminA VitaminD VitaminE VitaminK VitaminC Omega3 Omega6 Omega9 วิตามินA วิตามินD วิตามินE วิตามินK วิตามินB1
|
3 |
+
วิตามินB2 วิตามินB3 วิตามินB5 วิตามินB6 วิตามินB7 วิตามินB9 วิตามินB12 คอลเลสเตอรอล บลอกโคลี ผักใบเขียว ผักคะน้า ผักกวางตุ้ง น้ำมันรำข้าว ออกซิเจน
|
4 |
+
มะม่วงหาวมะนาวโห่ โฮลเกรน ถั่วเปลือกแข็ง ถั่วแขก ถั่วพู ถั่วฝักยาว ถั่วแปบ ถั่วเหลือง ถั่วปากอ้า ถั่วลันเตา ถั่วแดง ถั่วดำน้ำตาล น้ำปลา เนื้อแดง กะหล่ำปลี เรตินา โรค ลูทีน
|
5 |
+
ผักผลไม้ สีเหลือง ไขมันทรานซ์ การสูบบุหรี่ ซีแซนทีน สารลูทีน สารต้านอนุมูลอิสระ น้ำมันรำข้าว น้ำมันเมล็ดชา ยำปลาทู ผัดผักบุ้ง ต้มเลือดหมู ปลากระพง ปลากระพงนึ่ง
|
6 |
+
แกงส้มผักเลียง น้ำพริกมะขาม ผักลวก ปลาทับทิม กล้วยบวดชี ถั่วเขียวต้มน้ำตาล ถั่วแดงเย็น ไขมันอิ่มตัว น้ำมันมะพร้าว ขนมอบ อาหารทอด อาหารฟาสต์ฟู้ด ซีเรียล โฮลวิท หัวบุก
|
7 |
+
แมคคาเดเมีย ปลาทะเล ปลานิล ปลาสวาย แก้วมังกร ปลาแซลมอน ปลาซา์ดีน น้ำมันพืช น้ำมันดอกคำฝอย น้ำมันคาโนลา ใยอาหาร รำข้าว แอพริคอท บรอกโคลี กีวี่ ผัดผัก
|
8 |
+
ไก่ย่างติดหนัง นมพร่องมันเนย นมสด ผลไม้รสหวาน เนื้อสัตว์ติดมัน น้ำมันคาโนล่า ลูกพีช เนื้อสัตว์ติดไขมัน ไก่ติดหนัง เนื้อแดง คอลเรสเตอรอล เครื่องดื่มแอลกอฮอล์ ไตรกลีเซอร์ไรด์
|
9 |
+
ผักดอง ขาหมู หมูสามชั้น หนังไก่ทอด เครื่องในสัตว์ ผักผลไม้ดอง ไข่เค็ม น้ำซุป เครื่องปรุงรส น้ำขิง ข้าวต้มปลา ขนมปังโอลวีต เบอร์รี่ โพรไบโอติก ลูกพรุน อาร์ติโชค บร๊อคโคลี่
|
10 |
+
บล็อกโคลี โพรไปโอติกส์ ต้มข่าไก่ แกงกะทิ แกงแพนง เบเกอรี่ เฟรนช์ฟรายด์ ครีมเทียม หมูติดมัน แกงกะหรี่ สันคอหมู แอลกอฮอร์ แกงกะทิ ผัดไท หอยทอด ผัดซีอิ๊ว ดอกคำฝอย
|
11 |
+
ปลาซาบะ พริกหวาน เมล็ดแฟล็ก เชอเบท ปลาโอ ไก่ชุบแป้งทอด ปลาทอดชุบแป้ง แกงเหลือง ปลานึ่ง มะเขือเผา เครื่องดื่มแอลกอฮอล์ เครื่องดื่มคาเฟอีน เครื่องดื่มประเภทชากาแฟ
|
12 |
+
เครื่องดื่มแอลกฮอล์ เครื่องดื่มสมุนไพร เครื่องดื่มผสมแอลกอฮอล์ vitaminc vitamine น้ำตาล น้ำเกรวี่ น้ำตาล น้ำมะนาว น้ำมะพร้าว น้ำปั่น น้ำหล่อลื่น น���ำผัก น้ำลูกยอ น้ำเกรวี
|
13 |
+
น้ำเกาเหลา น้ำเชื่อม น้ำแป้ง น้ำมันปาล์ม เครื่องดื่มคาเฟอีน เครื่องดื่มประเภท แอลกอฮอล์ เนื้อสัตว์ บี6 บี12 ไข่แดง จมูกข้าว ผักโขม ธาตุเหล็ก น้ำมัน ปลาทูน่า ปลาน้ำจืด
|
14 |
+
ปลาดุก ปลาช่อน ปลาจะละเม็ด สาหร่ายทะเล เมล็ดเซีย เมล็ดฟักทอง น้ำมันมะกอก น้ำมันทานตะวัน ไขมันดี ไขมันเลว ข้าวกล้อง จมูกข้าวสาลี กล้วย นม นมถั่วเหลือง ไขมันต่ำ
|
15 |
+
อนุมูลอิสระ งด ไขมันที่ดี เนื้อสัตว์ไขมันต่ำ งา ข้าวโอ๊ต ปลาแม็คคลอเรล ปลาซาร์ดีน ปลากะพงขาว ปลาทู ปลาสลิด ปลาตะเพียน เต้าหู้ เนื้อสัตว์แปรรูป เนื้อสัตว์ที่ผ่านกระบวนการ โซเดียมสูง
|
16 |
+
ไส้กรอก หมูยอ ปลาเค็ม ถั่วเมล็ดแห้ง โควิด longcovid ลองโควิด มะเร็ง covid วัคซีน อีโบลา พิชิต ข้าว ตา หัวใจ longcovid ไวรัสโคโรนา มือเท้าปาก ขาอยู่ไม่สุข ต้อกระจก แพทย์แผนจีน
|
17 |
+
หยุดหายใจขณะหลับ ข้อเข่าเสื่อม ขากระตุกขณะหลับ นอนไม่หลับ พังผืดใต้ฝ่าเท้า ตกขาว ไม่ปกติ ประจำเดือน ง่วงนอน มาก น้ำตาล การออกกำลังกาย ติดเชื้อในปอด มะเร็ง อย่างไร เคมีบำบัด
|
18 |
+
เต้านม เรียนonline ภูมิแพ้ จมูกอักเสบ ตรวจภายใน เสมหะ officesyndrome การล้าง เลือกซื้อ ปลอดภัย ลดความเสี่ยง สารเคมีตกค้าง สุขภาพดี ลด หวาน ผู้สูงอายุ กินยาก ไข้เลือดออก
|
19 |
+
ไข้หวัดใหญ่ ท้องผูก ตับอักเสบเอ ก่อนมี ตัวอ่อน มีบุตรยาก ความดันต่ำ แท้ง คุมกำเนิด ไข่ปลาอุก embryoglue ผิวเสีย ปากมดลูก ผู้หญิง ข้อเข่า ลูก แพ้ นมแม่ รังไข่ ถุงน้ำ มะเร็ง เตือน
|
20 |
+
กระเพาะอาหาร
|
topic_model.pickle
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:00cd061e1fc0d4ef2d87e6105dd6a63f9781046acf295f725306a9ea53b96ab1
|
3 |
+
size 1188762432
|