Beispiel #1
0
        /// <summary>
        /// Gets a list of related frame element
        /// </summary>
        /// <param name="relation">Type of relation to fetch</param>
        /// <param name="relationDirection">Relation direction</param>
        /// <param name="recursive">Whether or not to recursively get related frame elements</param>
        /// <returns>List of FEs</returns>
        public FrameElementSet GetRelatedFrameElements(Frame.FrameRelation relation, Frame.FrameRelationDirection relationDirection, bool recursive)
        {
            FrameElementSet relatedFEs = new FrameElementSet();

            GetRelatedFrameElements(relation, relationDirection, recursive, relatedFEs);

            return(relatedFEs);
        }
Beispiel #2
0
        /// <summary>
        /// Gets list of related frame elements
        /// </summary>
        /// <param name="relation">Type of relation to fetch</param>
        /// <param name="relationDirection">Relation direction</param>
        /// <param name="recursive">Whether or not to recursively get related frame elements</param>
        /// <param name="currentFEs">Current list of related FEs</param>
        private void GetRelatedFrameElements(Frame.FrameRelation relation, Frame.FrameRelationDirection relationDirection, bool recursive, FrameElementSet currentFEs)
        {
            // add sub-FEs
            if (relationDirection == Frame.FrameRelationDirection.Sub || relationDirection == Frame.FrameRelationDirection.Both)
            {
                foreach (FrameElement subFE in _relationSubFrameElements[relation])
                {
                    if (!currentFEs.Contains(subFE))
                    {
                        currentFEs.Add(subFE);

                        // recursively add sub-FEs
                        if (recursive)
                        {
                            subFE.GetRelatedFrameElements(relation, relationDirection, recursive, currentFEs);
                        }
                    }
                }
            }

            // add super-FEs
            if (relationDirection == Frame.FrameRelationDirection.Super || relationDirection == Frame.FrameRelationDirection.Both)
            {
                foreach (FrameElement superFE in _relationSuperFrameElements[relation])
                {
                    if (!currentFEs.Contains(superFE))
                    {
                        currentFEs.Add(superFE);

                        // recursively add super-FEs
                        if (recursive)
                        {
                            superFE.GetRelatedFrameElements(relation, relationDirection, recursive, currentFEs);
                        }
                    }
                }
            }
        }
Beispiel #3
0
 /// <summary>
 /// Adds a frame element to the super-FE collection for a relation
 /// </summary>
 /// <param name="frameElement">Frame element to add</param>
 /// <param name="relation">Relation between current and given frame element</param>
 internal void AddSuperFrameElement(FrameElement frameElement, Frame.FrameRelation relation)
 {
     _relationSuperFrameElements[relation].Add(frameElement);
 }
Beispiel #4
0
        /// <summary>
        /// Constructor
        /// </summary>
        /// <param name="frameNetDirectory">Path to FrameNet distribution directory</param>
        /// <param name="version">FrameNet version</param>
        public FrameNetEngine(string frameNetDirectory, Version version)
        {
            if (!System.IO.Directory.Exists(frameNetDirectory))
            {
                throw new DirectoryNotFoundException("Invalid FrameNet directory");
            }

            _frameNameFrame             = new Dictionary <string, Frame>();
            _frameElementIdFrameElement = new Dictionary <int, FrameElement>();
            _lexemeLexicalUnitIDs       = new Dictionary <string, Set <int> >();
            _lexicalUnitIdFrame         = new Dictionary <int, Frame>();
            _lexicalUnitLexicalUnitIDs  = new Dictionary <string, Set <int> >();
            _lexicalUnitIdLexicalUnit   = new Dictionary <int, LexicalUnit>();

            if (version == Version.FrameNet_1_3)
            {
                // init annotation engine
                _lexicalUnitAnnotationEngine = new LexicalUnitAnnotationEngine(LAIR.CommonPort.IO.Directory.FindDirectory(frameNetDirectory, "luXML"), version);

                #region get frames
                Set <int> uniqueFrameIDCheck = new Set <int>();
                XmlParser framesP            = new XmlParser(System.IO.File.ReadAllText(LAIR.CommonPort.IO.Directory.FindFile(frameNetDirectory, "frames.xml")));
                while (framesP.SkipToElement("frame"))
                {
                    // create frame
                    string    frameXML        = framesP.OuterXML("frame");
                    XmlParser frameP          = new XmlParser(frameXML);
                    int       frameID         = int.Parse(frameP.AttributeValue("frame", "ID"));
                    string    frameName       = frameP.AttributeValue("frame", "name").ToLower().Trim(); // use lowercase for all frame names
                    string    frameDefinition = frameP.ElementText("definition");
                    Frame     frame           = new Frame(frameName, frameDefinition, frameID);

                    // add to frame index index
                    _frameNameFrame.Add(frame.Name, frame);
                    uniqueFrameIDCheck.Add(frame.ID);

                    // get frame elements
                    string    fesXML = frameP.OuterXML("fes");
                    XmlParser fesP   = new XmlParser(fesXML);
                    string    feXML;
                    while ((feXML = fesP.OuterXML("fe")) != null)
                    {
                        // get frame element
                        XmlParser    feParser = new XmlParser(feXML);
                        int          feID     = int.Parse(feParser.AttributeValue("fe", "ID"));
                        string       feName   = feParser.AttributeValue("fe", "name").Trim().ToLower();
                        string       feDef    = feParser.ElementText("definition");
                        FrameElement fe       = new FrameElement(feID, feName, feDef, frame);
                        frame.FrameElements.Add(fe);

                        // add to index
                        _frameElementIdFrameElement.Add(fe.ID, fe);
                    }

                    // get lexical units
                    string    lusXML    = frameP.OuterXML("lexunits");
                    XmlParser lusParser = new XmlParser(lusXML);
                    string    luXML;
                    while ((luXML = lusParser.OuterXML("lexunit")) != null)
                    {
                        XmlParser luParser = new XmlParser(luXML);
                        int       luID     = int.Parse(luParser.AttributeValue("lexunit", "ID"));
                        string    luName   = luParser.AttributeValue("lexunit", "name");
                        luName = luName.Substring(0, luName.IndexOf('.'));
                        string luPos = luParser.AttributeValue("lexunit", "pos");
                        string luDef = luParser.ElementText("definition");

                        // get lexemes for this lexunit...we may get duplicates...don't worry about them
                        Set <Lexeme> lexemes    = new Set <Lexeme>(false);
                        string       lexemesXML = luParser.OuterXML("lexemes");
                        XmlParser    lexemesP   = new XmlParser(lexemesXML);
                        string       lexemeXML;
                        while ((lexemeXML = lexemesP.OuterXML("lexeme")) != null)
                        {
                            XmlParser lexemeP     = new XmlParser(lexemeXML);
                            string    pos         = lexemeP.AttributeValue("lexeme", "pos");
                            bool      breakBefore = bool.Parse(lexemeP.AttributeValue("lexeme", "breakBefore"));
                            bool      head        = bool.Parse(lexemeP.AttributeValue("lexeme", "headword"));
                            string    value       = lexemeP.ElementText("lexeme");

                            lexemes.Add(new Lexeme(value, pos, breakBefore, head));
                        }

                        // create lexical unit and add to frame
                        LexicalUnit lexicalUnit = new LexicalUnit(luID, luName, luPos, luDef, lexemes);

                        frame.LexicalUnits.Add(lexicalUnit);

                        // add map from full lexeme string to lexical unit id
                        string lexemeString = lexicalUnit.ToString();
                        _lexemeLexicalUnitIDs.EnsureContainsKey(lexemeString, typeof(Set <int>), false);
                        _lexemeLexicalUnitIDs[lexemeString].Add(luID);

                        // add map from lexical unit to frame
                        _lexicalUnitIdFrame.Add(lexicalUnit.ID, frame);

                        // add map from lexical unit to lexical unit id
                        _lexicalUnitLexicalUnitIDs.EnsureContainsKey(lexicalUnit.Name, typeof(Set <int>));
                        _lexicalUnitLexicalUnitIDs[lexicalUnit.Name].Add(lexicalUnit.ID);

                        // add map from lexical unit ID to lexical unit
                        _lexicalUnitIdLexicalUnit.Add(lexicalUnit.ID, lexicalUnit);
                    }
                }
                #endregion

                #region get frame relations
                framesP = new XmlParser(System.IO.File.ReadAllText(LAIR.CommonPort.IO.Directory.FindFile(frameNetDirectory, "frRelation.xml")));
                string relationsXML;
                while ((relationsXML = framesP.OuterXML("frame-relation-type")) != null)
                {
                    // get relation type
                    XmlParser           relationsP = new XmlParser(relationsXML);
                    Frame.FrameRelation relation   = Frame.GetFrameRelation(relationsP.AttributeValue("frame-relation-type", "name"));

                    string relationXML;
                    while ((relationXML = relationsP.OuterXML("frame-relation")) != null)
                    {
                        XmlParser relationP      = new XmlParser(relationXML);
                        string    superFrameName = relationP.AttributeValue("frame-relation", "superFrameName").ToLower();
                        string    subFrameName   = relationP.AttributeValue("frame-relation", "subFrameName").ToLower();

                        Frame superFrame = _frameNameFrame[superFrameName];
                        Frame subFrame   = _frameNameFrame[subFrameName];

                        superFrame.GetSubFrames(relation).Add(subFrame);
                        subFrame.GetSuperFrames(relation).Add(superFrame);

                        // add FE relations
                        while (relationP.SkipToElement("fe-relation"))
                        {
                            int superFeID = int.Parse(relationP.AttributeValue("fe-relation", "supId"));
                            int subFeID   = int.Parse(relationP.AttributeValue("fe-relation", "subId"));

                            FrameElement superFE = superFrame.FrameElements.Get(superFeID);
                            FrameElement subFE   = subFrame.FrameElements.Get(subFeID);

                            superFE.AddSubFrameElement(subFE, relation);
                            subFE.AddSuperFrameElement(superFE, relation);
                        }
                    }
                }
                #endregion
            }
            else if (version == Version.FrameNet_1_5)
            {
                // init annotation engine
                _lexicalUnitAnnotationEngine = new LexicalUnitAnnotationEngine(LAIR.CommonPort.IO.Directory.FindDirectory(frameNetDirectory, "lu"), version);

                #region get frames
                Set <int> uniqueFrameIDCheck = new Set <int>();
                foreach (string framePath in System.IO.Directory.GetFiles(LAIR.CommonPort.IO.Directory.FindDirectory(frameNetDirectory, "frame"), "*.xml"))
                {
                    // create frame
                    XmlParser frameP          = new XmlParser(System.IO.File.ReadAllText(framePath));
                    int       frameID         = int.Parse(frameP.AttributeValue("frame", "ID"));
                    string    frameName       = frameP.AttributeValue("frame", "name").ToLower().Trim(); // use lowercase for all frame names
                    string    frameDefinition = frameP.ElementText("definition");
                    Frame     frame           = new Frame(frameName, frameDefinition, frameID);

                    // add to frame index index
                    _frameNameFrame.Add(frame.Name, frame);
                    uniqueFrameIDCheck.Add(frame.ID);

                    // get frame elements
                    string feXML;
                    while ((feXML = frameP.OuterXML("FE")) != null)
                    {
                        // get frame element
                        XmlParser    feParser = new XmlParser(feXML);
                        int          feID     = int.Parse(feParser.AttributeValue("FE", "ID"));
                        string       feName   = feParser.AttributeValue("FE", "name").Trim().ToLower();
                        string       feDef    = feParser.ElementText("definition");
                        FrameElement fe       = new FrameElement(feID, feName, feDef, frame);
                        frame.FrameElements.Add(fe);

                        // add to index
                        _frameElementIdFrameElement.Add(fe.ID, fe);
                    }

                    // get lexical units
                    frameP.Reset();
                    string luXML;
                    while ((luXML = frameP.OuterXML("lexUnit")) != null)
                    {
                        XmlParser luParser = new XmlParser(luXML);

                        string luPos  = luParser.AttributeValue("lexUnit", "POS");
                        string luName = luParser.AttributeValue("lexUnit", "name");
                        luName = luName.Substring(0, luName.IndexOf('.'));
                        int    luID  = int.Parse(luParser.AttributeValue("lexUnit", "ID"));
                        string luDef = luParser.ElementText("definition");

                        // get lexemes for this lexunit...we may get duplicates...don't worry about them
                        Set <Lexeme> lexemes = new Set <Lexeme>(false);
                        string       lexemeXML;
                        while ((lexemeXML = luParser.OuterXML("lexeme")) != null)
                        {
                            XmlParser lexemeP     = new XmlParser(lexemeXML);
                            bool      head        = bool.Parse(lexemeP.AttributeValue("lexeme", "headword"));
                            bool      breakBefore = bool.Parse(lexemeP.AttributeValue("lexeme", "breakBefore"));
                            string    pos         = lexemeP.AttributeValue("lexeme", "POS");
                            string    value       = lexemeP.AttributeValue("lexeme", "name");

                            lexemes.Add(new Lexeme(value, pos, breakBefore, head));
                        }

                        // create lexical unit and add to frame
                        LexicalUnit lexicalUnit = new LexicalUnit(luID, luName, luPos, luDef, lexemes);

                        frame.LexicalUnits.Add(lexicalUnit);

                        // add map from full lexeme string to lexical unit id
                        string lexemeString = lexicalUnit.ToString();
                        _lexemeLexicalUnitIDs.EnsureContainsKey(lexemeString, typeof(Set <int>), false);
                        _lexemeLexicalUnitIDs[lexemeString].Add(luID);

                        // add map from lexical unit to frame
                        _lexicalUnitIdFrame.Add(lexicalUnit.ID, frame);

                        // add map from lexical unit to lexical unit id
                        _lexicalUnitLexicalUnitIDs.EnsureContainsKey(lexicalUnit.Name, typeof(Set <int>));
                        _lexicalUnitLexicalUnitIDs[lexicalUnit.Name].Add(lexicalUnit.ID);

                        // add map from lexical unit ID to lexical unit
                        _lexicalUnitIdLexicalUnit.Add(lexicalUnit.ID, lexicalUnit);
                    }
                }
                #endregion

                #region get relations
                XmlParser allRelationsP = new XmlParser(System.IO.File.ReadAllText(LAIR.CommonPort.IO.Directory.FindFile(frameNetDirectory, "frRelation.xml")));
                string    relationsXML;
                while ((relationsXML = allRelationsP.OuterXML("frameRelationType")) != null)
                {
                    // get relation type
                    XmlParser           relationsP = new XmlParser(relationsXML);
                    Frame.FrameRelation relation   = Frame.GetFrameRelation(relationsP.AttributeValue("frameRelationType", "name"));

                    // read each instance of the relation
                    string relationXML;
                    while ((relationXML = relationsP.OuterXML("frameRelation")) != null)
                    {
                        XmlParser relationP = new XmlParser(relationXML);

                        // get related frames
                        Frame subFrame   = _frameNameFrame[relationP.AttributeValue("frameRelation", "subFrameName").ToLower()];
                        Frame superFrame = _frameNameFrame[relationP.AttributeValue("frameRelation", "superFrameName").ToLower()];

                        subFrame.GetSuperFrames(relation).Add(superFrame);
                        superFrame.GetSubFrames(relation).Add(subFrame);

                        // add FE relations
                        while (relationP.SkipToElement("FERelation"))
                        {
                            FrameElement subFE   = subFrame.FrameElements.Get(int.Parse(relationP.AttributeValue("FERelation", "subID")));
                            FrameElement superFE = superFrame.FrameElements.Get(int.Parse(relationP.AttributeValue("FERelation", "supID")));

                            subFE.AddSuperFrameElement(superFE, relation);
                            superFE.AddSubFrameElement(subFE, relation);
                        }
                    }
                }
                #endregion
            }
            else
            {
                throw new Exception("Unrecognized FrameNet version:  " + version);
            }
        }