【问题标题】:Advanced text search in actionscript-return ALL nouns,adjectives and verbsactionscript 中的高级文本搜索 - 返回所有名词、形容词和动词
【发布时间】:2010-03-12 22:17:51
【问题描述】:

我知道 as3 具有一些强大的新文本搜索功能,尤其是与正则表达式结合时。

我什至不知道这是否可能,但我想以某种方式搜索任何文本块,并返回所有名词、形容词和动词。

最好(最有效)的方法是什么? 正则表达式是一种选择吗? 或者我是否必须加载某种开源字典 9 用于拼写检查器)以与 or 进行比较??

之后,我提取了所有的名词、形容词和动词,我需要按它们的频率来计算和优先级。

欢迎提出任何建议...

【问题讨论】:

    标签: regex actionscript-3 text full-text-search


    【解决方案1】:

    没有任何正则表达式具有任何语法或词性概念。正则表达式只是一种在字符串中搜索模式的方法。

    如您所说,要执行您想做的事情,您需要插入“某种开源字典”。所涉及的工作量可能很大。

    【讨论】:

      【解决方案2】:

      我偶然发现了这个开源的全搜索引擎

      http://www.servebox.org/actionscript-foundry/actionscript-foundry-documentation/full-text-search-tree/

      步骤顺序如我所见

      1) 创建或获取所有英语名词、动词、形容词的列表(非常感谢任何有关获取或创建此列表的提示!)

      2) 搜索数据源以查看是否与第一个字典单词存在匹配

      3) 如果匹配存在,则建立一个包含出现次数的索引。

      4) 移动到字典中的第二个单词并重复步骤 2 和 3。

      5) 重复直到字典中的每个单词都被用于搜索。

      【讨论】:

        【解决方案3】:

        所以@Robusto 是正确的,您将需要某种字典数据,其中包含单词并将它们关联为名词、动词或形容词。但是,如果您可以找到或自己构建它(可能需要一段时间),您可以使用 AS3 中的 Dictionary 对象来构建您的结果数组:

        //dummy data
        var testString:String = "Mary had a little lamb her fleece was white as snow";
        var testString2:String = "The blue zebra had a rad jacket";
        
        var nouns:Array = ['cup', 'Mary', 'phone', 'lamb', 'jacket', 'fleece', 'snow', 'zebra'];
        var verbs:Array = ['had', 'was', 'ran', 'jumped', 'read'];
        var adj:Array =   ['awesome', 'rad', 'little', 'tall', 'white', 'blue', 'red'];
        
        //SETUP
        //Create the dictionaries, in a more complex setting you might load data in from an XML file
        //here I'm just pulling the data from the arrays created above
        var nounDict:Dictionary = createDictionary( nouns );
        var verbDict:Dictionary = createDictionary( verbs );
        var adjDict:Dictionary =  createDictionary( adj );
        
        //Creates a dictionary based on an Array of words
        function createDictionary( wordData:Array ):Dictionary {
            var dict:Dictionary = new Dictionary( true );
        
            for(var i:uint = 0; i < wordData.length; i++) {
        
                //add the word as a key to the dictionary
                dict[ wordData[i] ] = wordData[i];
        
            }
        
            return dict;
        }
        
        
        //SEARCHING
        //str is the string you want to search through
        //dict is the dictionary you want to use to search against the string
        function searchDictionary( str:String, dict:Dictionary ):Array {
        
            //break up the words by the spaces (you can figure out how to deal with punctuation)
            var words:Array = str.split(' ');
            //store the matching words in the matches array
            var matches:Array = [];
        
            for( var i:uint = 0; i < words.length; i++) {
        
        
                //check the dictionary for the word
                if(dict[ words[i] ]) {
                    matches.push(words[i]);
                }
        
            }
            return matches;
        
        }
        
        
        //TEST IT OUT
        trace( searchDictionary( testString, nounDict ) );
        trace( searchDictionary( testString, verbDict ) );
        trace( searchDictionary( testString, adjDict )  );
        
        trace( searchDictionary( testString2, nounDict ) );
        trace( searchDictionary( testString2, verbDict ) );
        trace( searchDictionary( testString2, adjDict ) );
        

        您可以将此代码弹出到一个新的 FLA 文件中,看看它是如何工作的。

        【讨论】:

        • 我要做的唯一改变是使用新的 Vector 类而不是数组
        【解决方案4】:

        感谢您的建议!

        我正在考虑的另一种方法是首先从源集合中删除所有代词、介词,然后索引所有剩余的单词。

        剩下的应该是所有名词、动词、副词的索引列表。

        我认为所有代词、介词(和连词?)的总列表比所有名词、动词、副词的总列表要小得多,因此对于任何给定的集合,这种消除类型搜索应该要快得多...

        【讨论】:

          猜你喜欢
          • 2015-11-26
          • 1970-01-01
          • 2018-03-02
          • 1970-01-01
          • 2013-05-20
          • 1970-01-01
          • 1970-01-01
          • 2011-05-09
          相关资源
          最近更新 更多