// マクロをメソッド化 private Node ADDUNKNWON(CharInfo cinfo, byte[] tSentence, int begin1, int begin2, int begin3, ref Node rResultNode) { Token tToken = m_UNKTokens[cinfo.DefaultType].Key; int tSize = m_UNKTokens[cinfo.DefaultType].Value; for (int k = 0; k < tSize; ++k) { Node tNewNode = new Node(); ReadNodeInfo(m_UNKDictionary, m_UNKDictionary.GetRelativeToken(tToken, k), ref tNewNode); tNewNode.char_type = ( byte )cinfo.DefaultType; tNewNode.surface_s = tSentence; tNewNode.surface_o = begin2; tNewNode.length = ( ushort )(begin3 - begin2); tNewNode.rlength = ( ushort )(begin3 - begin1); tNewNode.stat = MECAB_UNK_NODE; tNewNode.bnext = rResultNode; rResultNode = tNewNode; } return(rResultNode); }
// オフセット操作 public Node Lookup(byte[] tSentence, int tBegin, int tEnd) { CharInfo cinfo = new CharInfo(); Node result_node = null; int mblen = 0; int clen = 0; // 最大 65536 バイトに制限する tEnd = (tEnd - tBegin) >= 65535 ? tBegin + 65535 : tEnd; // オフセット操作 int begin2 = m_CharProperty.SeekToOtherType(tSentence, tBegin, tEnd, m_Space, ref cinfo, ref mblen, ref clen); DoubleArray.Word[] daresults = new DoubleArray.Word[kResultsSize]; for (int i = 0; i < daresults.Length; i++) { daresults[i] = new DoubleArray.Word(); } int results_size = kResultsSize; for (int it_p = 0; it_p < m_Dictionaries.Count; ++it_p) { WordDictionary it = m_Dictionaries[it_p]; int n = it.CommonPrefixSearch(tSentence, begin2, tEnd - begin2, daresults, results_size); for (int i = 0; i < n; ++i) { Token tToken = it.GetToken(daresults[i]); int tSize = it.GetSize(daresults[i]); for (int j = 0; j < tSize; ++j) { Node tNewNode = new Node(); ReadNodeInfo(it, it.GetRelativeToken(tToken, j), ref tNewNode); tNewNode.length = ( ushort )daresults[i].length; tNewNode.rlength = ( ushort )(begin2 - tBegin + tNewNode.length); // オフセット操作 tNewNode.surface_s = tSentence; tNewNode.surface_o = begin2; tNewNode.stat = MECAB_NOR_NODE; tNewNode.char_type = ( byte )cinfo.DefaultType; tNewNode.bnext = result_node; result_node = tNewNode; } } } if (result_node != null && cinfo.Invoke == 0) { return(result_node); } // オフセット操作 int begin3 = begin2 + mblen; // オフセット操作 int group_begin3 = 0; if (begin3 > tEnd) { //-------------------------------------------------------- // ADDUNKNWON ; ADDUNKNWON(cinfo, tSentence, tBegin, begin2, begin3, ref result_node); //-------------------------------------------------------- if (result_node != null) { return(result_node); } } if (cinfo.Group != 0) { int tmp = begin3; CharInfo fail = new CharInfo(); begin3 = m_CharProperty.SeekToOtherType(tSentence, begin3, tEnd, cinfo, ref fail, ref mblen, ref clen); if (clen <= DEFAULT_MAX_GROUPING_SIZE) { // ADDUNKNWON ; ADDUNKNWON(cinfo, tSentence, tBegin, begin2, begin3, ref result_node); } group_begin3 = begin3; begin3 = tmp; } for (int i = 1; i <= cinfo.Length; ++i) { if (begin3 > tEnd) { break; } if (begin3 == group_begin3) { continue; } clen = i; // ADDUNKNWON ; ADDUNKNWON(cinfo, tSentence, tBegin, begin2, begin3, ref result_node); if (cinfo.isKindOf(m_CharProperty.GetCharInfo(tSentence, begin3, tEnd, ref mblen)) == false) { break; } begin3 += mblen; } if (result_node == null) { // ADDUNKNWON ; ADDUNKNWON(cinfo, tSentence, tBegin, begin2, begin3, ref result_node); } return(result_node); }