对单词和类别值进行分类

时间:2009-06-04 11:22:33

标签: algorithm classification

我们今天在课堂上设置了一个算法问题,作为“如果你找到一个你不必做这个主题的解决方案”。当然,我们都认为我们会试一试。

基本上,我们提供了100个单词和10个类别的DB。单词或类别之间不匹配。所以它基本上是100个单词和10个类别的列表。

我们必须将单词“放置”到正确的类别中 - 也就是说,我们必须“弄清楚”如何将单词放入正确的类别中。因此,我们必须“理解”这个词,然后将其置于最合适的类别中。

即。其中一个词是“钓鱼”类别“运动” - >所以这将属于这一类。单词和类别之间存在一些重叠,因此某些单词可能会进入多个类别。

如果我们弄明白,我们必须增加样本量,并且“匹配率最高”的人获胜。

有没有人知道如何开始这样的事情?还是任何资源?最好是在C#中?

即使是关键字数据库或某些东西可能会有所帮助?有人知道任何免费的吗?

21 个答案:

答案 0 :(得分:17)

首先,您需要分析样本文本,以获得单词的关系。 latent semantic analysis中描述了Latent Semantic Analysis approaches to categorization的分类。

一种不同的方法是天真的贝叶斯文本分类。需要具有指定类别的示例文本。在学习步骤中,程序会学习不同的类别以及在分配给类别的文本中出现单词的可能性,请参阅bayes spam filtering。我不知道单词的效果如何。

答案 1 :(得分:10)

答案真的很差(表明没有“理解”) - 但作为一个疯狂的刺,你可以点击谷歌(通过代码)(例如)“+钓鱼+运动”,“+钓鱼+烹饪”等(即交叉加入)每个单词和类别) - 让谷歌斗争赢!即选择最多“命中”的组合......

例如(结果第一):

weather: fish
sport: ball
weather: hat
fashion: trousers
weather: snowball
weather: tornado

使用代码(TODO:添加线程;-p):

static void Main() {
    string[] words = { "fish", "ball", "hat", "trousers", "snowball","tornado" };
    string[] categories = { "sport", "fashion", "weather" };

    using(WebClient client = new WebClient()){
        foreach(string word in words) {
            var bestCategory = categories.OrderByDescending(
                cat => Rank(client, word, cat)).First();
            Console.WriteLine("{0}: {1}", bestCategory, word);
        }
    }
}

static int Rank(WebClient client, string word, string category) {
    string s = client.DownloadString("http://www.google.com/search?q=%2B" +
        Uri.EscapeDataString(word) + "+%2B" +
        Uri.EscapeDataString(category));
    var match = Regex.Match(s, @"of about \<b\>([0-9,]+)\</b\>");
    int rank = match.Success ? int.Parse(match.Groups[1].Value, NumberStyles.Any) : 0;
    Debug.WriteLine(string.Format("\t{0} / {1} : {2}", word, category, rank));
    return rank;
}

答案 2 :(得分:7)

也许你们都在努力做到这一点。

显然,您需要某种外部参考来对X在Y类中的概率进行排名。他是否有可能测试您的“开箱即用”思维并且您可能是外部参考?也就是说,算法是一个简单的问题,贯穿每个类别和每个单词,并询问你(或坐在终端的任何人)是否单词X在显示的类别Y中。这个主题有一些简单的变化,但它们都是通过简单地切割它来消除过去的结局。

或不......取决于老师。

答案 3 :(得分:3)

所以看起来你有几个选择,但在大多数情况下,我认为如果你想要准确的数据,你将需要使用一些外部帮助。我能想到的两个选择是使用字典搜索或众包。

关于字典搜索,您可以浏览数据库,查询并解析结果,以查看是否在页面上显示了其中一个类别名称。例如,如果您搜索“red”,您会在页面上找到“颜色”,同样,搜索“fishing”会在页面上返回“sport”。

另外,在盒子外面稍微多一点的选择就是利用众包,考虑以下几点:

  1. 从或多或少随机分配名称 - 值对开始。
  2. 输出结果。
  3. 将结果加载到Amazon Mechanical Turk(AMT)上,以获取人类对对象工作情况的反馈。
  4. 将AMT评估的结果与随机分配一起输入系统。
  5. 如果一切都获得批准,那么我们就完成了。
  6. 否则,保留正确的匹配并处理它们以查看是否可以建立任何模式,生成一组新的名称 - 值对。
  7. 返回第3步。
  8. 虽然这需要一些财务支出,但它也可能是您将在相当容易的基础上获得的最简单和准确的数据版本之一。

答案 4 :(得分:2)

您可以使用自定义算法专门处理该数据,例如以'ing'结尾的单词是动词(现在分词),可以是运动。

创建一组分类规则,如上所述,并查看您获得的准确度。

编辑:

窃取维基百科数据库(无论如何都是免费的)并获取十个类别中每个类别下的文章列表。计算每个类别下所有文章中每100个单词的出现次数,并且该单词的“关键字密度”最高的类别(例如钓鱼)获胜。

答案 5 :(得分:2)

这听起来像你可以使用spam filtering中使用的某种贝叶斯分类。但这仍然需要某种文本库形式的“外部数据”来提供上下文。

没有它,问题就无法解决。这不是算法问题,而是AI问题。但即使人工智能(以及自然情报,也就此而言)需要某种投入来学习。

我怀疑教授给你一个不可能的问题,让你明白你可以在什么不同的层面上思考一个问题。

这里的关键问题是:谁决定什么是“正确的”分类?这个决定基于什么?如何以编程方式重现此决策,以及需要哪些输入数据?

答案 6 :(得分:1)

我假设问题允许使用外部数据,因为否则我无法设想从算术上推断词语含义的方法。

也许可以用同义词库来完成某些事情,并寻找“单词”单词和“类别”单词之间的最小距离?

答案 7 :(得分:1)

解雇这位老师。

解决此问题的唯一方法是已经解决了问题。 IE浏览器。您需要一个关键字和类别表来构建代码,将关键字分类。

除非您按照建议添加一个“理解”英语的系统。这是坐在电脑前的人或专家系统。

如果你正在建立一个专家系统,甚至不知道它,那么老师就不擅长提出问题。

答案 8 :(得分:1)

谷歌被禁止,但他们几乎有一个完美的解决方案 - Google Sets

因为您需要取消单词的语义,所以需要外部数据源。您可以尝试使用WordNet。或者您也可以尝试使用Wikipedia - 找到每个单词的页面(或者仅针对类别),并查找页面或链接页面上出现的其他单词。

答案 9 :(得分:1)

有趣的问题。您正在看的是单词分类。虽然您可以学习和使用传统的信息检索方法,如LSA和基于此的分类 - 我不确定这是否是您的意图(如果是,那么一定要这样做!)

既然你说你可以使用外部数据,我建议使用wordnet及其在单词之间的链接。例如,使用wordnet,

# S: (n) **fishing**, sportfishing (the act of someone who fishes as a diversion)
* direct hypernym / inherited hypernym / sister term
      o S: (n) **outdoor sport, field sport** (a sport that is played outdoors)
      + direct hypernym / inherited hypernym / sister term
            # S: (n) **sport**, athletics 
            (an active diversion requiring physical exertion and competition) 

我们在这里看到的是单词之间的关系列表。 钓鱼一词涉及户外运动,它与 sport 有关。

现在,如果你得到漂移 - 可以使用这种关系来计算将“钓鱼”分类为“运动”的概率 - 比如,基于单词链的线性距离或出现次数,等。 (应该很容易找到有关如何使用wordnet构建相似性度量的资源。当教授说“不要使用谷歌”时,我认为他是以编程方式而不是获取信息来阅读的手段!)

至于带有wordnet的C# - http://opensource.ebswift.com/WordNet.Net/

怎么样?

答案 10 :(得分:1)

是的,我会选择wordnet方法。 在WordNet-based semantic similarity measurement上查看本教程。您可以在princeton.edu(google it)在线查询Wordnet,因此为您的问题编写解决方案应该相对容易。 希望这会有所帮助,

X

答案 11 :(得分:0)

您可以使用蒙特卡罗方法和人工反馈来实现学习算法。让系统随机对单词进行分类,然后要求您将其投票为“匹配”或“不匹配”。如果匹配,则该词被分类并且可以被消除。如果不是,系统会在将来的迭代中将其从该类别中排除,因为它知道它不属于那里。这将得到非常准确的结果。

这很容易适用于100字的问题。对于更大的问题,您可以将其与有根据的猜测相结合,以使流程更快地运行。在这里,正如上面提到的许多人所说,你需要外部资源。谷歌的方法可能会发挥最好的作用,因为谷歌已经完成了大量的工作,但是除非您可以使用facebook apis从您的Facebook帐户中提取数据并尝试找出哪些词在统计上更有可能用以前分类的单词出现。

但是,无论哪种方式,如果没有某种外部输入在某种程度上来自人类,这是不可能做到的。除非您想要厚颜无耻,例如,通过名称的ascii文本中包含的某些序列化值来定义类别:P

答案 12 :(得分:0)

您可以使用WordNet数据库,创建一些指标来确定两个单词(单词类别)之间的紧密联系,然后选择最佳类别单词放入。

答案 13 :(得分:0)

当你解决这个“谜语”时你不需要参加这个主题,我认为这并不容易。 不过我会做这样的事情(以非常简单的方式讲述)

建立一个神经网络,你给出一些输入(一本(e)书,一些(e)书) =&GT;没有谷歌需要

此网络对单词进行分类(神经网络非常适合'不确定'分类)。我想你可能只是知道哪个词属于哪个类别,因为文本中出现了。 ('钓鱼'可能会在'体育'附近提及)。 在对神经网络进行一些训练之后,它应该将这些单词“链接”到类别中。

答案 14 :(得分:0)

Scrape delicious.com并搜索每个单词,查看集体标记计数等。

我可以说的不多,但是美味又古老,庞大,标记非常严重,并且包含大量当前相关的语义信息。以这种方式构建语义数据库非常容易,使用单词列表作为刮擦的基础。

知识在标签中。

答案 15 :(得分:0)

我的尝试是使用CRM114的工具集来提供分析大型文本语料库的方法。然后你可以利用它的匹配来猜测。

答案 16 :(得分:0)

我天真的做法:

  1. 创建一个巨大的文本文件,例如thisread the article for inspiration
  2. 对于每个单词,扫描文本,每当您匹配该单词时,请计算出在其左右两侧出现的N(最大,也称为无线电)位置的“类别”。
  3. 这个词可能属于具有最大反击的类别。

答案 17 :(得分:0)

使用(在线或下载)WordNet,并查找单词和每个类别之间必须遵循的关系数量。

答案 18 :(得分:0)

好吧,你不能使用Google,但你可以使用Yahoo,Ask,Bing,Ding,Dong,Kong ...... 我会做几次通行证。首先查询针对2-3个搜索引擎的100个单词,抓取前面的y结果文章(y是实验的阈值。我认为这是一个好的开始)并扫描文本。特别是我将搜索10个类别。如果某个类别出现的时间超过x时间(x再次为某个阈值,则需要进行试验),这是一个匹配。 基于该x阈值(即类别在文本中出现的次数)以及它中出现的前y页面的可能性,您可以为单词类别对分配权重。 为了获得更好的准确性,您可以使用具有单词类别对(具有AND关系)的非Google搜索引擎进行另一次传递,并将结果页数应用于该对的权重。他们只是假设权重最高的单词类别对是正确的(假设你甚至有多个选项)。如果权重足够接近(z阈值可能),您还可以将多个单词分配给多个类别。 基于此,您可以引入任意数量的单词和任意数量的类别。你将赢得挑战。 我也认为这种方法很适合评估广告中潜在adwords的权重。但那是另一个话题......

祝你好运

Harel的

答案 19 :(得分:0)

使用现有的分类大数据集(例如RCV1)来训练您选择的系统。你可以做得更糟,然后到start reading existing research and benchmarks

来自谷歌的公寓还有其他可以构建的“百科全书”数据集,其中一些作为Amazon Web Services上的公共数据集托管,例如英文维基百科的完整快照。

要有创意。除谷歌之外还有其他数据。

答案 20 :(得分:0)

我的第一个想法是利用外部数据。编写一个谷歌搜索每个单词的程序,并采用在搜索结果中出现第一/最高的“类别”:)

但这可能被视为作弊。