// get the wordVec // lowercase the word public virtual DoubleVec GetWordVec(string word) { string inWord = GetKeyWord(word); DoubleVec @out = wordVecMap_.GetValueOrNull(inWord); return(@out); }
private static void TestOnSet(Word2Vec w2vIm, Word2Vec w2vOm) { string inText = "He was diagnosed early on set dementia 3 years ago."; TextObj textObj = new TextObj(inText); List <TokenObj> inTextList = textObj.GetTokenList(); // remove space token from the list List <TokenObj> nonSpaceTokenList = TextObj.GetNonSpaceTokenObjList(inTextList); Console.WriteLine("=========================================="); Console.WriteLine("-- inTextList: [" + inText + "]"); int tarPos = 4; int tarSize = 2; // "on set" has 2 tokens int radius = 2; bool word2VecSkipWord = true; bool debugFlag = false; // 1 context with window radius DoubleVec contextVec = Word2VecContext.GetContextVec(tarPos, tarSize, nonSpaceTokenList, w2vIm, radius, word2VecSkipWord, debugFlag); string str1 = "onset"; ContextScore s1 = new ContextScore(str1, contextVec, w2vOm); string str2 = "on set"; ContextScore s2 = new ContextScore(str2, contextVec, w2vOm); Console.WriteLine("- [" + str1 + "]: " + s1.ToString()); Console.WriteLine("- [" + str2 + "]: " + s2.ToString()); }
private static void Test(string inTerm, DoubleVec contextVec, Word2Vec w2vIm, Word2Vec w2vOm) { double cwobScore = GetScore(inTerm, contextVec, w2vOm); double cwobScore2 = GetScore2(inTerm, contextVec, w2vOm); double cosScore = GetSimilarityScore(inTerm, contextVec, w2vIm); Console.WriteLine(inTerm + "|" + string.Format("{0,1:F8}", cwobScore) + "|" + string.Format("{0,1:F8}", cwobScore2) + "|" + string.Format("{0,1:F8}", cosScore)); }
// try two different method, inner dot or cos private static double GetCwobScore(DoubleVec vec1, DoubleVec vec2) { //double score = DoubleVecUtil.GetInnerDot(vec1, vec2); // normailzed score between -1.0 to 1.0 double score = DoubleVecUtil.GetCosineSimilarity(vec1, vec2); return(score); }
// private method private static double GetSimilarityScore(DoubleVec vec1, DoubleVec vec2) { double score = DoubleVecUtil.GetCosineSimilarity(vec1, vec2); // set the min. to 0.0 score = (score <= 0.0 ? 0.0d : score); return(score); }
// public constructor /// <summary> /// Public constructor for ContextScore /// </summary> /// <param name="inTerm"> target token or candidate (can be multiword) </param> /// <param name="contextVec"> wordVec of context from IM </param> /// <param name="word2Vec"> word2Vec matrix of OM </param> public ContextScore(string inTerm, DoubleVec contextVec, Word2Vec word2Vec) { term_ = inTerm; // Use Cosine Similarity between IM and OM score_ = Word2VecScore.GetScore(inTerm, contextVec, word2Vec); // TBD: use 2-3 gram //score_ = NgramScore.GetScore(word, ngram); }
// use cosineSimilarity instead of inner dot private static double GetInnerDotScore(DoubleVec vec1, DoubleVec vec2) { double score = DoubleVecUtil.GetInnerDot(vec1, vec2); // set the min. to 0.0 // it seems -score is useful for split .... //score = (score <= 0.0?0.0d:score); return(score); }
// from ensemble paper, use the word vector (Input Matrix) for w2v // word2VecIm: word2Vec input matrix - syn0 // Similarity score use word2Vec Im public static double GetSimilarityScore(string inTerm, DoubleVec contextVec, Word2Vec word2VecIm) { // 1. Get Avg. score for inTerm DoubleVec termVec = GetWordVecForTerm(inTerm, word2VecIm); // 2. Get Cosine similarity between contextVec and tarVec double score = GetSimilarityScore(termVec, contextVec); return(score); }
// Use Avg. word2Vec Om for each word in the inTerm private static DoubleVec GetWordVecForTerm(string inTerm, Word2Vec w2vOm) { List <string> inWordList = TermUtil.ToWordList(inTerm); // avg. the wordVec if inTerm is a multiword DoubleVec outWordVec = GetAvgWordVecForList(inWordList, w2vOm); // TBD: take care of possesive return(outWordVec); }
// context from all inTextList, no specify on window radius public static DoubleVec GetContextVec(int tarPos, int tarSize, List <TokenObj> nonSpaceTokenList, Word2Vec w2vIm, bool word2VecSkipWord, bool debugFlag) { // 1. get the context List <string> contextList = GetContext(tarPos, tarSize, nonSpaceTokenList, w2vIm, word2VecSkipWord, debugFlag); // 2. get the wordVec for the context DoubleVec contextVec = Word2VecScore.GetAvgWordVecForList(contextList, w2vIm); return(contextVec); }
// public method // inTerm: candidate (can be multiword) // contextVec: wordVec of context // word2VecOm: word2Vec output matrix - syn1neg // Use CWOB model to predict the target word = H X OM public static double GetScore(string inTerm, DoubleVec contextVec, Word2Vec w2vOm) { // 1. Get Avg. Vec for term (candidate from prediction) DoubleVec termVec = GetWordVecForTerm(inTerm, w2vOm); // 2. got the inner dot between hidden layer (context) and OM // to predict the output matrix in CBOW double score = GetCwobScore(termVec, contextVec); return(score); }
// private constructor public CSpellScore(string wordStr, string candStr, WordWcMap wordWcMap, DoubleVec contextVec, Word2Vec word2Vec, double wf1, double wf2, double wf3) { wordStr_ = wordStr; candStr_ = candStr; // calculate score oScore_ = new OrthographicScore(wordStr_, candStr_, wf1, wf2, wf3); fScore_ = new FrequencyScore(candStr_, wordWcMap); nScore_ = new NoisyChannelScore(wordStr_, candStr_, wordWcMap, wf1, wf2, wf3); cScore_ = new ContextScore(candStr_, contextVec, word2Vec); }
// return the best ranked str from candidates using word2Vec score // inTokenList, includes space token, is not coreTerm.Lc // return null if no candidate is found to correct public static MergeObj GetTopRankMergeObj(HashSet <MergeObj> candidates, List <TokenObj> nonSpaceTokenList, Word2Vec word2VecIm, Word2Vec word2VecOm, bool word2VecSkipWord, int contextRadius, double rwMergeFactor, bool debugFlag) { // init the topRankMergeObj MergeObj topRankMergeObj = null; if (candidates.Count > 0) { // 1. find sorted score list for each candidates ... List <ContextScore> candScoreList = GetCandidateScoreList(candidates, nonSpaceTokenList, word2VecIm, word2VecOm, word2VecSkipWord, contextRadius, debugFlag); // 2. find the top ranked str // the 0 element has the highest score because it is sorted // only 1 candidate, use it for nonWord ContextScore topContextScore = null; if (candScoreList.Count > 0) { topContextScore = candScoreList[0]; } // 3. find the mergeObj from the topRankStr (if exist) if (topContextScore != null) { // 3.1. convert mergeObj set to string set // key: coreMergeWord, MergeObj Dictionary <string, MergeObj> candStrMergeObjMap = new Dictionary <string, MergeObj>(); foreach (MergeObj mergeObj in candidates) { string mergeWord = mergeObj.GetCoreMergeWord(); candStrMergeObjMap[mergeWord] = mergeObj; } HashSet <string> andStrSet = new HashSet <string>(candStrMergeObjMap.Keys); // 3.2 convert back from top rank str to MergeObj // topRankStr should never be null because candidates is > 0 string topRankStr = topContextScore.GetTerm(); topRankMergeObj = candStrMergeObjMap.GetValueOrNull(topRankStr); // 4. compare the top rank merge to the original string b4 merge // 1. get the word2Vec score for the orgMergeTerm b4 merge // 1.1 wordVec for context int tarPos = topRankMergeObj.GetStartPos(); // tarSize is the total token No of the orgMergeWords int tarSize = topRankMergeObj.GetEndPos() - topRankMergeObj.GetStartPos() + 1; DoubleVec contextVec = Word2VecContext.GetContextVec(tarPos, tarSize, nonSpaceTokenList, word2VecIm, contextRadius, word2VecSkipWord, debugFlag); // 1.2 wordVec for the original words before merge string orgMergeWord = topRankMergeObj.GetOrgMergeWord(); ContextScore orgContextScore = new ContextScore(orgMergeWord, contextVec, word2VecOm); // validate top merge candidate, set to null if false if (IsTopCandValid(orgContextScore, topContextScore, rwMergeFactor, debugFlag) == false) { // set to null if score is not good enough for corection topRankMergeObj = null; } } } return(topRankMergeObj); }
// private method // Test merge and Split private static void Test(string inText, int tarPos, int tarSize, int radius, string mergedWord, string splitWords, Word2Vec w2vIm, Word2Vec w2vOm) { // 0. process the inText TextObj textObj = new TextObj(inText); List <TokenObj> inTextList = textObj.GetTokenList(); // remove space token from the list List <TokenObj> nonSpaceTokenList = TextObj.GetNonSpaceTokenObjList(inTextList); Console.WriteLine("=========================================="); Console.WriteLine("-- inTextList: [" + inText + "]"); bool word2VecSkipWord = true; bool debugFlag = false; // 1.a context with window radius DoubleVec contextVec = Word2VecContext.GetContextVec(tarPos, tarSize, nonSpaceTokenList, w2vIm, radius, word2VecSkipWord, debugFlag); // 1.b context with all inText DoubleVec contextVecA = Word2VecContext.GetContextVec(tarPos, tarSize, nonSpaceTokenList, w2vIm, word2VecSkipWord, debugFlag); // 1.c get score1 ContextScore score1 = new ContextScore(mergedWord, contextVec, w2vOm); ContextScore score1a = new ContextScore(mergedWord, contextVecA, w2vOm); Console.WriteLine(score1.ToString() + "|" + string.Format("{0,1:F8}", score1a.GetScore())); // 2. split words ContextScore score2 = new ContextScore(splitWords, contextVec, w2vOm); ContextScore score2a = new ContextScore(splitWords, contextVecA, w2vOm); Console.WriteLine(score2.ToString() + "|" + string.Format("{0,1:F8}", score2a.GetScore())); // 3. 3. 3. Use avg. score on single words // This method use different context for each single word List <string> splitWordList = TermUtil.ToWordList(splitWords); int index = 0; double scoreSAvg = 0.0d; // radius double scoreSAAvg = 0.0d; // all inText //debugFlag = false; foreach (string splitWord in splitWordList) { // window radius DoubleVec contextVecS = Word2VecContext.GetContextVec(tarPos + index, 1, nonSpaceTokenList, w2vIm, radius, word2VecSkipWord, debugFlag); ContextScore scoreS = new ContextScore(splitWord, contextVecS, w2vOm); //System.out.println("-- " + scoreS.ToString()); scoreSAvg += scoreS.GetScore(); // all text DoubleVec contextVecSA = Word2VecContext.GetContextVec(tarPos + index, 1, nonSpaceTokenList, w2vIm, word2VecSkipWord, debugFlag); ContextScore scoreSA = new ContextScore(splitWord, contextVecSA, w2vOm); //System.out.println("-- " + scoreSA.ToString()); scoreSAAvg += scoreSA.GetScore(); index++; } scoreSAvg = scoreSAvg / index; // window scoreSAAvg = scoreSAAvg / index; // all text Console.WriteLine("Avg. Single Word|" + string.Format("{0,1:F8}", scoreSAvg) + "|" + string.Format("{0,1:F8}", scoreSAAvg)); }
private static void TestWin(string inTerm, DoubleVec contextVec, Word2Vec w2vIm, Word2Vec w2vOm) { double cwobScore = GetScore(inTerm, contextVec, w2vOm); double cwobScore2 = GetScore2(inTerm, contextVec, w2vOm); double cosScore = GetSimilarityScore(inTerm, contextVec, w2vIm); Console.Write(string.Format("{0,1:F4}", cwobScore) + "-" + string.Format("{0,1:F4}", cwobScore2) + "|"); /* * System.out.println(inTerm + "|" + String.format("%1.8f", cwobScore) + "|" + String.format("%1.8f", cosScore)); */ }
// return candidate set with cSpell score // wordStr is the srcTxt used to calculate the score between it and cand public static HashSet <CSpellScore> GetCandidateScoreSet(string wordStr, HashSet <string> candidates, WordWcMap wordWcMap, int tarPos, int tarSize, List <TokenObj> nonSpaceTokenList, Word2Vec word2VecIm, Word2Vec word2VecOm, bool word2VecSkipWord, int contextRadius, double wf1, double wf2, double wf3, bool debugFlag) { HashSet <CSpellScore> candScoreSet = new HashSet <CSpellScore>(); foreach (string cand in candidates) { // find context for each candidates DoubleVec contextVec = Word2VecContext.GetContextVec(tarPos, tarSize, nonSpaceTokenList, word2VecIm, contextRadius, word2VecSkipWord, debugFlag); CSpellScore cs = new CSpellScore(wordStr, cand, wordWcMap, contextVec, word2VecOm, wf1, wf2, wf3); candScoreSet.Add(cs); } return(candScoreSet); }
private static bool CheckRealWord1To1Rules(ContextScore topContextScore, string inStr, int tarPos, int tarSize, List <TokenObj> nonSpaceTokenList, Word2Vec word2VecIm, Word2Vec word2VecOm, bool word2VecSkipWord, int contextRadius, double rw1To1Factor, bool debugFlag) { // return false if no topCand found if ((topContextScore == null) || (topContextScore.GetTerm().Equals(inStr))) { return(false); } // 1. get the word2Vec score for the org inStr b4 one-to-one // 1.1 wordVec for context DoubleVec contextVec = Word2VecContext.GetContextVec(tarPos, tarSize, nonSpaceTokenList, word2VecIm, contextRadius, word2VecSkipWord, debugFlag); // 1.2 wordVec for the original words before one-to-one ContextScore orgCs = new ContextScore(inStr, contextVec, word2VecOm); DebugPrint.Println("--- Real-Word One-To-One Context Score Detail: ---", debugFlag); DebugPrint.Println("- Score - orgTerm: " + orgCs.ToString(), debugFlag); DebugPrint.Println("- Score - top 1-to-1: " + topContextScore.ToString(), debugFlag); DebugPrint.Println("- rw1To1Factor: " + rw1To1Factor, debugFlag); // Score rules for one-to-one double orgScore = orgCs.GetScore(); double topScore = topContextScore.GetScore(); bool flag = false; // 2.1 no one-to-one correction if orgScore is 0.0d, no word2Vec information if (orgScore < 0.0d) { // 2.2a one-to-one if the org score is negative and top score is positive if (topScore > 0.0d) { // another rule for word2Vec on real-word if (((topScore - orgScore) > 0.085) && (orgScore > -0.085)) // help from 0.6812 to 0.6877 { flag = true; } } // 2.2b one-to-one if the org score is negative and top score is better else if ((topScore < 0.0d) && (topScore > orgScore * rw1To1Factor)) { flag = true; } } else if (orgScore > 0.0d) { // 2.3a merge if the org score is positive and better 0.01*topScore if (topScore * rw1To1Factor > orgScore) { flag = true; } } return(flag); }
private void ReadWordVectors(string inFile, bool verboseFlag) { // init wordVecMap_ = new Dictionary <string, DoubleVec>(); int lineNo = 0; string line = null; try { StreamReader @in = new StreamReader(new FileStream(inFile, FileMode.Open, FileAccess.Read), Encoding.UTF8); // read in line by line from a file while (!string.ReferenceEquals((line = @in.ReadLine()), null)) { var buf = line.Split(" "); // first line is the stats wordNo|dimension if (lineNo == 0) { wordNo_ = int.Parse(buf[0]); dimension_ = int.Parse(buf[1]); //dimension_ = line0.split(delimiter).length -1; } else // word|vector { string word = buf[0]; double[] array = new double[dimension_]; for (int i = 0; i < dimension_; i++) { array[i] = double.Parse(buf[i + 1]); } // update wordVec wordVecMap_[word] = new DoubleVec(array); } lineNo++; } // close @in.Close(); } catch (IOException e) { Console.Error.WriteLine("** [email protected]( ), problem of reading file (" + inFile); Console.Error.WriteLine("Line: " + lineNo + " - " + line); Console.Error.WriteLine("Exception: " + e.ToString()); } // print out if (verboseFlag == true) { Console.WriteLine("====== Word2Vec.ReadWordVectors( ) ======"); Console.WriteLine("- inFile: " + inFile); Console.WriteLine("- Word no: " + wordNo_); Console.WriteLine("- dimension: " + dimension_); } }
// return candidate set with context score // word2Vec is the word|wordVec map to get the wordVec // Not sorted, because it is a set // tarPos: starting position of target token // tarSize: token size of target token (single word = 1) // contextRadius: windown radius public static HashSet <ContextScore> GetCandidateScoreSet(HashSet <string> candidates, int tarPos, int tarSize, List <TokenObj> nonSpaceTokenList, Word2Vec word2VecIm, Word2Vec word2VecOm, bool word2VecSkipWord, int contextRadius, bool debugFlag) { // 1. get the context and contextVec, using input matrix DoubleVec contextVec = Word2VecContext.GetContextVec(tarPos, tarSize, nonSpaceTokenList, word2VecIm, contextRadius, word2VecSkipWord, debugFlag); // 2. get context score for all candidates HashSet <ContextScore> candScoreSet = new HashSet <ContextScore>(); foreach (string cand in candidates) { // get ContextSocre for each candidates, use output matrix ContextScore cs = new ContextScore(cand, contextVec, word2VecOm); candScoreSet.Add(cs); } return(candScoreSet); }
// return candidate set with context score // word2Vec is the word|wordVec map to get the wordVec // Not sorted, because it is a set // tarPos: starting position of target token // tarSize: token size of target token (single word = 1) public static HashSet <ContextScore> GetCandidateScoreSet(HashSet <MergeObj> candidates, List <TokenObj> nonSpaceTokenList, Word2Vec word2VecIm, Word2Vec word2VecOm, bool word2VecSkipWord, int contextRadius, bool debugFlag) { HashSet <ContextScore> candScoreSet = new HashSet <ContextScore>(); // get context score for all candidates // go through all merge candidates, all have differetn context foreach (MergeObj mergeObj in candidates) { // 1. get the context and contextVec, using input matrix int tarPos = mergeObj.GetStartPos(); int tarSize = mergeObj.GetEndPos() - mergeObj.GetStartPos() + 1; DoubleVec contextVec = Word2VecContext.GetContextVec(tarPos, tarSize, nonSpaceTokenList, word2VecIm, contextRadius, word2VecSkipWord, debugFlag); // 2. get ContextSocre for each merge, use output matrix string mergeWord = mergeObj.GetCoreMergeWord(); ContextScore cs = new ContextScore(mergeWord, contextVec, word2VecOm); candScoreSet.Add(cs); } return(candScoreSet); }
// this method is to be deleted because it has same result as GetScore() public static double GetScore2(string inTerm, DoubleVec contextVec, Word2Vec w2vOm) { List <string> inWordList = TermUtil.ToWordList(inTerm); double score = 0.0d; int count = 0; foreach (string word in inWordList) { DoubleVec wordVec = w2vOm.GetWordVec(word); if (wordVec != null) { score += GetCwobScore(wordVec, contextVec); } count++; } // add score first, then calculate the avg. score = score / count; return(score); }
// return the best ranked str from candidates using context score // this method is replaced by GetTopRankStr, which sorted by comparator public static string GetTopRankStrByScore(string inStr, HashSet <string> candidates, int tarPos, int tarSize, List <TokenObj> nonSpaceTokenList, Word2Vec word2VecIm, Word2Vec word2VecOm, bool word2VecSkipWord, int contextRadius, bool debugFlag) { // 1. get the context and contextVec DoubleVec contextVec = Word2VecContext.GetContextVec(tarPos, tarSize, nonSpaceTokenList, word2VecIm, contextRadius, word2VecSkipWord, debugFlag); string topRankStr = inStr; double maxScore = 0.0d; foreach (string cand in candidates) { ContextScore cs = new ContextScore(cand, contextVec, word2VecOm); double score = cs.GetScore(); // update only if the score is > 0.0d if (score > maxScore) { topRankStr = cand; maxScore = score; } } return(topRankStr); }
// return the best ranked str from candidates using word2Vec score // inTokenList, includes space token, is not coreTerm.Lc // return the orignal inStr if no candidate has score > 0.0d public static string GetTopRankStr(string inStr, HashSet <string> candidates, int tarPos, int tarSize, List <TokenObj> nonSpaceTokenList, Word2Vec word2VecIm, Word2Vec word2VecOm, bool word2VecSkipWord, int contextRadius, int shortSplitWordLength, int maxShortSplitWordNo, double rwSplitFactor, int maxCandNo, bool debugFlag) { // init string topRankStr = inStr; // Find the correction str if (candidates.Count > 0) { // 1. sorted score list for each candidates ... // This ranking can be improved if n-gram model (frequecny) is used List <ContextScore> candScoreList = RankByContext.GetCandidateScoreList(candidates, tarPos, tarSize, nonSpaceTokenList, word2VecIm, word2VecOm, word2VecSkipWord, contextRadius, debugFlag); // 1.1 get the top tank candidate ContextScore topContextScore = candScoreList[0]; // 2. validate the top rank // 2.1 wordVec for context DoubleVec contextVec = Word2VecContext.GetContextVec(tarPos, tarSize, nonSpaceTokenList, word2VecIm, contextRadius, word2VecSkipWord, debugFlag); // 2.2 wordVec for the original words before split ContextScore orgContextScore = new ContextScore(inStr, contextVec, word2VecOm); // 2.3 compare the top rank split to the original string b4 split if (IsTopCandValid(inStr, orgContextScore, topContextScore, rwSplitFactor, debugFlag) == true) { // no correction: if score is not good enough for corection topRankStr = topContextScore.GetTerm(); } // debug print if (debugFlag == true) { // print focus token (original) DebugPrint.PrintCScore(orgContextScore.ToString(), debugFlag); // print candidates ContextScoreComparator <ContextScore> csc = new ContextScoreComparator <ContextScore>(); var list = candScoreList.OrderBy(x => x, csc).Take(maxCandNo).Select(obj => obj.ToString()).ToList(); foreach (var item in list) { DebugPrint.PrintCScore(item, debugFlag); } } } return(topRankStr); }
// Average wordVec for a list of words public static DoubleVec GetAvgWordVecForList(IList <string> wordList, Word2Vec word2Vec) { // init the matrix to all zero int dimension = word2Vec.GetDimension(); DoubleVec aveWordVec = new DoubleVec(dimension); int count = 0; foreach (string word in wordList) { DoubleVec wordVec = word2Vec.GetWordVec(word); if (wordVec != null) { aveWordVec.Add(wordVec); } count++; } // calculate the avg. if (count != 0) { aveWordVec.Divide(count); } return(aveWordVec); }
// return the best ranked str from candidates using context score // this method is replaced by GetTopRankStr, which sorted by comparator public static MergeObj GetTopRankMergeObjByScore(HashSet <MergeObj> candidates, List <TokenObj> nonSpaceTokenList, Word2Vec word2VecIm, Word2Vec word2VecOm, bool word2VecSkipWord, int contextRadius, bool debugFlag) { MergeObj topRankMergeObj = null; double maxScore = 0.0d; foreach (MergeObj mergeObj in candidates) { // 1. get the context and contextVec int tarPos = mergeObj.GetStartPos(); int tarSize = mergeObj.GetEndPos() - mergeObj.GetStartPos() + 1; DoubleVec contextVec = Word2VecContext.GetContextVec(tarPos, tarSize, nonSpaceTokenList, word2VecIm, contextRadius, word2VecSkipWord, debugFlag); // 2. get ContextSocre for each merge, use output matrix string mergeWord = mergeObj.GetCoreMergeWord(); ContextScore cs = new ContextScore(mergeWord, contextVec, word2VecOm); double score = cs.GetScore(); // update only if the score is > 0.0d if (score > maxScore) { topRankMergeObj = mergeObj; maxScore = score; } } return(topRankMergeObj); }
private static void Tests(Word2Vec w2vIm, Word2Vec w2vOm) { string inText = "for the last 10 years was dianosed\n early on set deminita 3 years ago"; List <TokenObj> inTextList = TextObj.TextToTokenList(inText); // remove space token from the list List <TokenObj> nonSpaceTokenList = TextObj.GetNonSpaceTokenObjList(inTextList); List <string> testStrList = new List <string>(); testStrList.Add("diagnosed"); testStrList.Add("diagnose"); testStrList.Add("dianosed"); // init context int tarPos = 6; int tarSize = 1; int radius = 2; bool word2VecSkipWord = true; bool debugFlag = false; DoubleVec contextVec = Word2VecContext.GetContextVec(tarPos, tarSize, nonSpaceTokenList, w2vIm, radius, word2VecSkipWord, debugFlag); Console.WriteLine("===== Test diagnosed|diagnose|dianosed (window-2) ====="); Console.WriteLine("inText: [" + inText + "]"); Console.WriteLine("============================================"); Console.WriteLine("Candidates|CBOW score|CBOW score 2|Similarity score"); Console.WriteLine("============================================"); foreach (string testStr in testStrList) { Test(testStr, contextVec, w2vIm, w2vOm); } Console.WriteLine("===== Test diagnosed|diagnose|dianosed (whole text) ====="); contextVec = Word2VecContext.GetContextVec(tarPos, tarSize, nonSpaceTokenList, w2vIm, word2VecSkipWord, debugFlag); foreach (string testStr in testStrList) { Test(testStr, contextVec, w2vIm, w2vOm); } string inText1 = "Not all doctors know about this syndrome."; List <TokenObj> inTextList1 = TextObj.TextToTokenList(inText1); // remove space token from the list List <TokenObj> nonSpaceTokenList1 = TextObj.GetNonSpaceTokenObjList(inTextList1); Console.WriteLine("===== Test know about|know|about (window) ====="); List <string> testStrList1 = new List <string>(); testStrList1.Add("know about"); testStrList1.Add("know"); testStrList1.Add("about"); tarPos = 3; tarSize = 2; radius = 2; contextVec = Word2VecContext.GetContextVec(tarPos, tarSize, nonSpaceTokenList1, w2vIm, radius, word2VecSkipWord, debugFlag); Test(testStrList1[0], contextVec, w2vIm, w2vOm); contextVec = Word2VecContext.GetContextVec(tarPos, tarSize, nonSpaceTokenList1, w2vIm, word2VecSkipWord, debugFlag); Test(testStrList1[0], contextVec, w2vIm, w2vOm); tarPos = 3; tarSize = 1; contextVec = Word2VecContext.GetContextVec(tarPos, tarSize, nonSpaceTokenList1, w2vIm, radius, word2VecSkipWord, debugFlag); Test(testStrList1[1], contextVec, w2vIm, w2vOm); contextVec = Word2VecContext.GetContextVec(tarPos, tarSize, nonSpaceTokenList1, w2vIm, word2VecSkipWord, debugFlag); Test(testStrList1[1], contextVec, w2vIm, w2vOm); tarPos = 4; tarSize = 1; contextVec = Word2VecContext.GetContextVec(tarPos, tarSize, nonSpaceTokenList1, w2vIm, radius, word2VecSkipWord, debugFlag); Test(testStrList1[2], contextVec, w2vIm, w2vOm); contextVec = Word2VecContext.GetContextVec(tarPos, tarSize, nonSpaceTokenList1, w2vIm, word2VecSkipWord, debugFlag); Test(testStrList1[2], contextVec, w2vIm, w2vOm); string inText2 = "for the last 10 years was diagnosed early on set dementia 3 years ago."; List <TokenObj> inTextList2 = TextObj.TextToTokenList(inText2); // remove space token from the list List <TokenObj> nonSpaceTokenList2 = TextObj.GetNonSpaceTokenObjList(inTextList2); List <string> testStrList2 = new List <string>(); testStrList2.Add("onset"); testStrList2.Add("on set"); Console.WriteLine("===== Test onset|on set (window-3) ====="); Console.WriteLine("inText: [" + inText + "]"); tarPos = 8; tarSize = 2; radius = 3; contextVec = Word2VecContext.GetContextVec(tarPos, tarSize, nonSpaceTokenList2, w2vIm, radius, word2VecSkipWord, debugFlag); foreach (string testStr in testStrList2) { Test(testStr, contextVec, w2vIm, w2vOm); } tarPos = 8; tarSize = 1; radius = 3; contextVec = Word2VecContext.GetContextVec(tarPos, tarSize, nonSpaceTokenList2, w2vIm, radius, word2VecSkipWord, debugFlag); Test("on", contextVec, w2vIm, w2vOm); tarPos = 9; contextVec = Word2VecContext.GetContextVec(tarPos, tarSize, nonSpaceTokenList2, w2vIm, radius, word2VecSkipWord, debugFlag); Test("set", contextVec, w2vIm, w2vOm); Console.WriteLine("===== Test onset|on set (whole text) ====="); radius = nonSpaceTokenList2.Count; contextVec = Word2VecContext.GetContextVec(tarPos, tarSize, nonSpaceTokenList2, w2vIm, word2VecSkipWord, debugFlag); foreach (string testStr in testStrList2) { Test(testStr, contextVec, w2vIm, w2vOm); } Console.WriteLine("===== Go through each tokens with diff radius 1-9) ====="); Console.WriteLine("tarPos|tarWord|r=1|r=2|r=3|r=4|r=5|r=6|r=7|r=8|r=9"); //String inText3 = "Broken bones can not sleep at night!"; string inText3 = "not xyxy all doctors know about this syndrome."; List <TokenObj> inTextList3 = TextObj.TextToTokenList(inText3); // remove space token from the list List <TokenObj> nonSpaceTokenList3 = TextObj.GetNonSpaceTokenObjList(inTextList3); tarPos = 0; tarSize = 1; radius = 0; foreach (TokenObj tokenObj in nonSpaceTokenList3) { // skip the space token string tokenStr = tokenObj.GetTokenStr(); string inStr = Word2VecContext.NormWordForWord2Vec(tokenStr); Console.Write(tarPos + "|" + tokenStr + "|"); // print out all radius for (int r = 1; r < 10; r++) { contextVec = Word2VecContext.GetContextVec(tarPos, tarSize, inTextList2, w2vIm, r, word2VecSkipWord, debugFlag); TestWin(inStr, contextVec, w2vIm, w2vOm); } Console.WriteLine(""); tarPos++; } }
// return the best ranked str from candidates using word2Vec score // inTokenList, includes space token, is not coreTerm.Lc // return the orignal inStr if no candidate has score > 0.0d public static string GetTopRankStr(string inStr, HashSet <string> candidates, CSpellApi cSpellApi, int tarPos, List <TokenObj> nonSpaceTokenList, bool debugFlag) { // init WordWcMap wordWcMap = cSpellApi.GetWordWcMap(); Word2Vec word2VecIm = cSpellApi.GetWord2VecIm(); Word2Vec word2VecOm = cSpellApi.GetWord2VecOm(); int contextRadius = cSpellApi.GetRw1To1ContextRadius(); bool word2VecSkipWord = cSpellApi.GetWord2VecSkipWord(); int maxCandNo = cSpellApi.GetCanMaxCandNo(); double wf1 = cSpellApi.GetOrthoScoreEdDistFac(); double wf2 = cSpellApi.GetOrthoScorePhoneticFac(); double wf3 = cSpellApi.GetOrthoScoreOverlapFac(); int tarSize = 1; // only for one-to-one, no merge here string topRankStr = inStr; // use cSpell top candidates int topNo = 1; // top sort string inStrLc = inStr.ToLower(); List <CSpellScore> cSpellScoreList = RankByCSpellRealWord1To1.GetCandidateScoreList(inStrLc, candidates, wordWcMap, tarPos, tarSize, nonSpaceTokenList, word2VecIm, word2VecOm, word2VecSkipWord, contextRadius, wf1, wf2, wf3, debugFlag); // Find the correction str and correct if (cSpellScoreList.Count > 0) { // the rw top rank must be in both NC and orthographic CSpellScore topScore = cSpellScoreList[0]; double topFScore = topScore.GetFScore().GetScore(); //frequency double topTScore = topScore.GetOScore().GetTokenScore(); // Token double topPScore = topScore.GetOScore().GetPhoneticScore(); //Phone double topOScore = topScore.GetOScore().GetOverlapScore(); //overlap ContextScore orgContextScore = null; // check the frequency // get the max score of frequency, eidt, phonetic, and overlap // the top rank must have all top score for above if ((topFScore == CSpellScore.GetMaxFScore(cSpellScoreList)) && (topTScore == CSpellScore.GetMaxEScore(cSpellScoreList)) && (topPScore == CSpellScore.GetMaxPScore(cSpellScoreList)) && (topOScore == CSpellScore.GetMaxOScore(cSpellScoreList))) { ContextScore topContextScore = topScore.GetCScore(); // 1.1 wordVec for context DoubleVec contextVec = Word2VecContext.GetContextVec(tarPos, tarSize, nonSpaceTokenList, word2VecIm, contextRadius, word2VecSkipWord, debugFlag); // 1.2 wordVec for the original words before one-to-one orgContextScore = new ContextScore(inStr, contextVec, word2VecOm); FrequencyScore orgFScore = new FrequencyScore(inStr, wordWcMap); // pass the orgContextScore if (IsTopCandValid(inStr, orgContextScore, topScore, orgFScore, cSpellApi, debugFlag) == true) { // no correction: if score is not good enough for corection topRankStr = topScore.GetCandStr(); // debug print for ananlysis /// <summary> ///* /// System.out.println("======= cSpellScoreList.size(): " /// + cSpellScoreList.size() + " ========"); /// System.out.println(inStr /// + "," + String.format("%1.8f", orgFScore.GetScore()) /// + "," + String.format("%1.8f", orgContextScore.GetScore())); /// System.out.println(CSpellScore.GetScoreHeader()); /// for(CSpellScore cSpellScore: cSpellScoreList) /// { /// System.out.println(cSpellScore.ToString(",")); /// } /// ** /// </summary> } } // debug print if (debugFlag == true) { // print focus token (original) if (orgContextScore != null) { DebugPrint.PrintScore(orgContextScore.ToString(), debugFlag); } else { DebugPrint.PrintScore("No score for focus (" + inStr + ")", debugFlag); } // print candidate var list = cSpellScoreList.Take(maxCandNo).Select(obj => obj.ToString()).ToList(); foreach (var item in list) { DebugPrint.PrintScore(item, debugFlag); } } } return(topRankStr); }