static PennTreebankHeadFinder()
 {
     mSkipSet.Add("POS");
     mSkipSet.Add(",");
     mSkipSet.Add(":");
     mSkipSet.Add(".");
     mSkipSet.Add("''");
     mSkipSet.Add("-RRB-");
     mSkipSet.Add("-RCB-");
 }
 static PennTreebankHeadFinder()
 {
     mSkipSet.Add(PartsOfSpeechStrings.PossessiveEnding);
     mSkipSet.Add(PartsOfSpeechStrings.Comma);
     mSkipSet.Add(PartsOfSpeechStrings.ColonSemiColon);
     mSkipSet.Add(PartsOfSpeechStrings.SentenceFinalPunctuation);
     mSkipSet.Add(PartsOfSpeechStrings.RightCloseDoubleQuote);
     mSkipSet.Add("-RRB-");
     mSkipSet.Add("-RCB-");
 }
Esempio n. 3
0
    /// Input format: each two vectors represents a segment from the beginning.
    /// Considering all triangles are filled and non-triangle structure is always empty.
    /// Extract the outlines (may have holes) and return the outline.
    /// Points in each edge is arranged where their left-side is filled.
    /// Notice edges are not in order, but two points in each edge has its order.
    public static List <Vector2> ExtractEdge(this List <Vector2> src)
    {
        var adj = new Dictionary <Vector2, List <Vector2> >();

        for (int i = 0; i < src.Count; i += 2)
        {
            adj.GetOrDefault(src[i]).Add(src[i + 1]);
            adj.GetOrDefault(src[i + 1]).Add(src[i]);
        }

        // Sort the adjacent edges.
        foreach (var x in adj)
        {
            var curVert = x.Key;
            var adjList = x.Value;
            int Compare(Vector2 va, Vector2 vb)
            {
                Vector2 da = curVert.To(va);
                Vector2 db = curVert.To(vb);
                float   aa = Mathf.Atan2(da.y, da.x);
                float   ba = Mathf.Atan2(db.y, db.x);

                return(aa <ba ? -1 : aa> ba ? 1 : 0);
            }

            adjList.Sort(Compare);
        }

        // output size should not exceeded input size.
        var rest = new Util.Set <Edge>(src.Count);

        foreach (var vert in src.Distinct().ToList())
        {
            var adx = adj[vert];
            for (int i = 0; i < adx.Count; i++)
            {
                var from = adx[i];
                var to   = adx[(i + 1).ModSys(adx.Count)];

                // Exclude the edge if triangle edges are arranged clockwise.
                if (new Triangle(vert, from, to).area <= 0)
                {
                    continue;
                }

                // Edges can either appear for 1 or 2 times.
                // Because an edge can only be owned by 1 or 2 triangles.
                // Use this to extract outlines, including outlines inside.
                var edge = new Edge(from, to);

                // take up about 200ms time when src.Length == 60000.
                if (rest.Contains(edge))
                {
                    rest.Remove(edge);
                }
                else
                {
                    rest.Add(edge);
                }
            }
        }

        var res = new List <Vector2>();

        rest.Foreach((i) => { res.Add(i.a); res.Add(i.b); });
        return(res);
    }