// 검색한 사진 이름 return public List <string> Search(List <string> findTerms, List <string> ignoreTerms, out string dogName) { var dogNames = TableManager.Instance.DogNames; // 개 이름이 있는지 검사. dogName = string.Empty; foreach (var term in findTerms) { if (dogNames.Contains(term)) { dogName = term; break; } } if (dogName == string.Empty) { UIManager.Instance.Alert("경고!! 개 이름을 입력해주세요!!!"); return(null); } findTerms.Remove(dogName); VectorTable vectorTable = TableManager.Instance.vectorTables[dogName]; List <int> dogPhotoIndexes = new List <int>(); List <IndexWeightSet> dogIndexWeightSets = new List <IndexWeightSet>(); // 찾는 검색어가 없다면 해당 개 사진 다 출력 if (findTerms.Count == 0) { for (int i = 0; i < vectorTable.Columns.Count; i++) { dogPhotoIndexes.Add(i); } } // 검색할 사진의 개 사진 인덱스 추가 foreach (var term in findTerms) { if (vectorTable.ColumnTable.TryGetValue(term, out List <float> values)) { for (int i = 0; i < values.Count; i++) { if (values[i] > 0) { if (!dogPhotoIndexes.Contains(i)) { dogIndexWeightSets.Add(new IndexWeightSet(i, values[i])); dogPhotoIndexes.Add(i); } else { // 가중치 더함. dogIndexWeightSets[dogPhotoIndexes.IndexOf(i)].weight += values[i]; } } } } } // 무시할 검색어 포함한 사진 인덱스 제거 foreach (var term in ignoreTerms) { if (vectorTable.ColumnTable.TryGetValue(term, out List <float> values)) { for (int i = 0; i < values.Count; i++) { if (values[i] > 0) { if (dogPhotoIndexes.Contains(i)) { dogIndexWeightSets.RemoveAt(dogPhotoIndexes.IndexOf(i)); dogPhotoIndexes.Remove(i); } } } } } // 내림차순 정렬 dogIndexWeightSets.Sort(); dogIndexWeightSets.Reverse(); List <string> result = new List <string>(); if (dogIndexWeightSets.Count > 0) { foreach (var set in dogIndexWeightSets) { string photoName = vectorTable.Columns[set.index]; result.Add(photoName); } } else { foreach (var index in dogPhotoIndexes) { string photoName = vectorTable.Columns[index]; result.Add(photoName); } } return(result); }
public static List <VectorTable> Read(string file) { List <VectorTable> vectorTables = new List <VectorTable>(); var datas = Resources.LoadAll <TextAsset>(file); foreach (var data in datas) { VectorTable vectorTable = new VectorTable(); var table = new Dictionary <KeyValuePair <string, string>, float>(); var lines = Regex.Split(data.text, LINE_SPLIT_RE); var rows = new List <string>(); Dictionary <string, List <float> > columnTable = new Dictionary <string, List <float> >(); Dictionary <string, List <float> > rowTable = new Dictionary <string, List <float> >(); if (lines.Length <= 1) { continue; } // 헤더 분리 var header = Regex.Split(lines[0], SPLIT_RE); // 헤더 리스트 추가 List <string> columns = new List <string>(header); columns.RemoveAt(0); string rowName = string.Empty; for (var i = 1; i < lines.Length; i++) { List <float> rowValues = new List <float>(); // 값 분리 var values = Regex.Split(lines[i], SPLIT_RE); if (values.Length == 0 || values[0] == "") { continue; } for (var j = 0; j < header.Length && j < values.Length; j++) { if (j == 0) { rowName = values[j]; rows.Add(values[j]); continue; } string value = values[j]; value = value.TrimStart(TRIM_CHARS).TrimEnd(TRIM_CHARS).Replace("\\", ""); float finalvalue = float.Parse(value); KeyValuePair <string, string> keySet = new KeyValuePair <string, string>(columns[j - 1], rowName); // 테이블에 추가 table.Add(keySet, finalvalue); rowValues.Add(finalvalue); // 해당 헤더에 해당하는 값 추가 if (rowTable.TryGetValue(header[j], out List <float> columnList)) { columnList.Add(finalvalue); } else { rowTable.Add(header[j], new List <float>()); rowTable[header[j]].Add(finalvalue); } } columnTable.Add(rowName, rowValues); } vectorTable.DogName = data.name; vectorTable.Table = table; vectorTable.Rows = rows; vectorTable.Columns = columns; vectorTable.RowTable = rowTable; vectorTable.ColumnTable = columnTable; vectorTables.Add(vectorTable); } return(vectorTables); }