如何使用 WordNet 或与 wordnet 相关来实现基于类别的文本标记?
Posted
技术标签:
【中文标题】如何使用 WordNet 或与 wordnet 相关来实现基于类别的文本标记?【英文标题】:How to implement category based text tagging using WordNet or related to wordnet? 【发布时间】:2014-02-27 07:42:57 【问题描述】:如何使用 wordnet 按单词的类别标记文本(java 作为接口)?
示例
考虑句子:
1) 计算机需要键盘、显示器、CPU 才能工作。 2)汽车使用齿轮和离合器。
现在我的目标是,例句必须标记为
第一句第二句计算机/电子 键盘/电子 CPU / 电子
一些额外的例子......汽车/机械 齿轮 / 机械 离合器 / 机械
“使用微芯片监控离合器和齿轮” -> 离合器/机械、齿轮/机械、微芯片/电子
“此处用于监测氢含量的软件”-> 软件/计算机、氢/化学 ..
我想在java中实现上面提到的目标,即按相关类别标记名词,例如技术,机械,电气等。
如何使用 wordnet 做到这一点。
我以前的作品
为了实现我的目标,我为每个类别在文本文件中创建了一个术语索引,并将其与标题相匹配。如果它在文本文件中包含一个单词,则标题被分类。
例如
Automobile.txt
拥有car , gear , wheel , clutch
。 networking.txt
有server,IP Address,TCP , RIP
这是算法:
String Classify (String title)
String area;
if (compareWordsFrom ("Automobile.txt",title) == true ) area = "Auto";
if (compareWordsFrom ("Netoworking.txt",title) == true ) area = "Networking";
if (compareWordsFrom ("metels.txt",title) == true ) area = "Metallurgy";
return area;
很难找到相关的词来建立索引。也就是说,汽车领域有1000个很难找到的相关术语。
确切地说,手动建立术语索引是一个令人心碎的过程
我已经使用了 Stanford NLP 、 Open NLP ,但是它们标记了 POS ,但不能满足需要。
我的需要 我需要一种自动化的工作方式。做自然语言处理技术能够做到这一点。 ?
有人建议使用wordnet库,但我怎么用它,因为它就像字典一样,但我想要..
机械 = 齿轮,涡轮,发动机 ....) 电子 = microchip , RAM , ROM ,...)
有没有类似上述结构的单词数据库..
或者我有现成的库吗?
【问题讨论】:
你有标记句子的语料库来训练机器学习算法吗?您知道可供选择的完整标签集吗?同样在您的示例中,您在语义上标记名词,但在语法上其他所有内容,这是故意的吗? @DanielMahler...我编辑了我的问题..再读一遍..它包含您查询的信息 【参考方案1】:您需要将一堆名词(例如“汽车”、“齿轮”)分类为预定义的类别(例如“汽车”)。尽管命名实体识别是完成此任务的正确方法,但它也有问题,主要问题是收集足够的注释数据以正确训练系统。
WordNet 可以通过在名词之间建立 semantic similarity 来提供帮助,从而帮助您根据相似度分数选择类别。有几种建立相似度分数的方法。一些突出的是
Lin's information-theoretic definition of similarity LESK,一个基于术语字典定义重叠程度的分数。 Wu & Palmer's score 基于同义词集深度基本思想是相似的术语被一个本体(例如 WordNet)分组到相似的类别下。因此,如果它们密切相关,它们在本体的类别树中的类别之间的距离会更短,否则会更长。也许最简单的分数是路径分数:
PathScore(s1, s2) = 1/pathLength(s1, s2)
其中pathLength是上述类别树中路径的长度。
举例说明:
PathScore(*car*, *automobile*) = 1.0; // path score is always between 0 and 1
WuPalmerScore(*car*, *automobile*) = 1.0; // Wu & Palmer's score is always between 0 and 1
PathScore(*engine*, *automobile*) = 0.25;
WuPalmerScore(*engine*, *automobile*) = 0.88;
PathScore(*microprocessor*, *automobile*) = 0.09;
WuPalmerScore(*microprocessor*, *automobile*) = 0.58;
因此,如您所见,您想要在同一类别中的术语通常具有更高的相似度分数。执行此操作的最佳库是 WordNet Similarity for Java,它提供了几个相似性指标供您试验。他们还有一个online demo here。
警告 如果您尝试标记专有名词,WordNet 将无法正常运行。例如,如果您希望 Hyundai 属于汽车类别,而 Samsung 属于电子产品类别,这根本无济于事……因为 WordNet 没有分类这些名词。在 WordNet 之上构建的其他本体可能会在这种情况下为您提供帮助:
这样一个著名的本体是Yago。 使用***分类是另一种成功的方法。【讨论】:
以上是关于如何使用 WordNet 或与 wordnet 相关来实现基于类别的文本标记?的主要内容,如果未能解决你的问题,请参考以下文章
WordNet(JWI MIT):如何查找具有特定字母/短语的单词?
如何使用 WordNet 路径算法计算两个字符串中单词的语义相似度