【问题标题】:Word Net - Word Synonyms & related word constructs - Java or PythonWord Net - 单词同义词和相关的单词结构 - Java 或 Python
【发布时间】:2011-08-08 15:10:32
【问题描述】:

我希望使用 WordNet 从一组基本术语中查找相似术语的集合。

例如,单词 'discouraged' - 潜在的同义词可能是:daunted, glum, deterred, pessimistic

我还想识别潜在的二元语法,例如; beat down, put off, caved in

如何使用 Java 或 Python 提取这些信息?是否有任何托管的 WordNet 数据库/Web 界面允许此类查询?

谢谢!

【问题讨论】:

    标签: java python nlp text-mining wordnet


    【解决方案1】:

    通过查看最容易理解 WordNet 数据 在 Prolog 文件中。它们记录在这里:

    http://wordnet.princeton.edu/wordnet/man/prologdb.5WN.html

    WordNet 术语被分组为同义词集。同义词集是最大的 同义词集。 Synsets 有一个主键,因此它们可以被使用 在语义关系中。

    所以回答你的第一个问题,你可以列出不同的 一个词的意义和对应的同义词如下:

    Input X: Term
    Output Y: Sense  
    Output L: Synonyms in this Sense  
    
    s_helper(X,Y) :- s(X,_,Y,_,_,_).  
    ?- setof(H,(s_helper(Y,X),s_helper(Y,H)),L).  
    

    例子:

    ?- setof(H,(s_helper(Y,'discouraged'),s_helper(Y,H),L).  
    Y = 301664880,  
    L = [demoralised, demoralized, discouraged, disheartened] ;  
    Y = 301992418,  
    L = [discouraged] ;  
    No  
    

    对于您问题的第二部分,WordNet 术语是 单词序列。所以你可以搜索这个 WordNet 术语 对于以下词语:

    Input X: Word  
    Output Y: Term
    
    s_helper(X) :- s(_,_,X,_,_,_).  
    word_in_term(X,Y) :- atom_concat(X,' ',H), sub_atom(Y,0,_,_,H).
    word_in_term(X,Y) :- atom_concat(' ',X,H), atom_concat(H,' ',J), sub_atom(Y,_,_,_,J).
    word_in_term(X,Y) :- atom_concat(' ',X,H), sub_atom(Y,_,_,0,H).
    ?- s_helper(Y), word_in_term(X,Y).
    

    例子:

    ?- s_helper(X), word_in_term('beat',X).  
    X = 'beat generation' ;  
    X = 'beat in' ;  
    X = 'beat about' ;  
    X = 'beat around the bush' ;  
    X = 'beat out' ;  
    X = 'beat up' ;  
    X = 'beat up' ;  
    X = 'beat back' ;  
    X = 'beat out' ;  
    X = 'beat down' ;  
    X = 'beat a retreat' ;  
    X = 'beat down' ;  
    X = 'beat down' ;  
    No
    

    这会给你潜在的 n-gram,但没有那么多 形态变异。 WordNet 也展示了一些 词汇关系,这可能很有用。

    但是我给出的两个 Prolog 查询都不是很有效。 问题是缺少一些词索引。一个爪哇 实施当然可以实施更好的东西。 想象一下:

    class Synset {  
        static Hashtable<Integer,Synset> synset_access;  
        static Hashtable<String,Vector<Synset>> term_access;  
    }
    

    一些 Prolog 可以做同样的事情,通过索引指令,它是 可以指示 Prolog 系统索引多个 谓词的参数。

    建立一个网络服务也不应该那么困难 在 Java 或 Prolog 中。许多 Prologs 系统很容易允许嵌入 Web 服务器中的 Prolog 程序和 Java 冠军 servlet。

    可以在此处找到支持 Web 服务器的 Prolog 列表:

    http://en.wikipedia.org/wiki/Comparison_of_Prolog_implementations#Operating_system_and_Web-related_features

    最好的问候

    【讨论】:

    • 感谢您提供此信息,非常有帮助。快速提问,我仍然不能 100% 确定这一点,但如果可能的话,以编程方式将“气馁”之类的词与“击败”联系起来的最佳方法是什么?
    • 取决于“链接”和编程语言。在 WordNet 中有两种“链接”,语义和词汇。通过 Prolog,对于语义链接,您可以断言事实链接(synset_id1,synset_id2)。对于词汇链接,您将断言事实链接(synset_id1,word_num1,synset_id2,word_num2)。在 Java 中,您将使用适当的数据结构/服务。或者你把这两个词放在同一个同义词集中,或者在它们一起创建一个新的同义词集中。后者适用于您的“链接”应该代表相同含义的情况。
    【解决方案2】:

    这是两个不同的问题。

    1) Wordnet 和 python。使用 NLTK,它有一个很好的 interface to wordnet。你可以自己写一些东西,但老实说,为什么要让生活变得困难呢? Lingpipe 可能还内置了一些东西,但 NLTK 更容易使用。我认为 nltk 只是下载一个 ntlk 数据库,但我很确定有 api 可以与 wordnet 对话。

    2) 在 nltk follow this tutorial 中获取二元组。通常,您将文本标记化,然后通过向前和向后遍历句子,获取每个单词的所有 n-gram。

    【讨论】:

    • 感谢您的链接。根据我对 WordNet 的测试,无法识别某些短语,例如“beat down”,这是正确的吗?
    • 如果你在线使用wordnet你可以看到一些同义词:wordnetweb.princeton.edu/perl/…
    • 也许在线版本是一个较新的词库?
    【解决方案3】:

    作为 NLTK 的替代方法,您可以使用可用 WordNet SPARQL 端点的one 来检索此类信息。查询示例:

    PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
    PREFIX wordnet: <http://www.w3.org/2006/03/wn/wn20/schema/>
    
    SELECT DISTINCT ?label {
      ?input_word a wordnet:WordSense;
         rdfs:label ?input_label.
      FILTER (?input_label = 'run')
      ?synset wordnet:containsWordSense ?input_word.
      ?synset wordnet:containsWordSense ?synonym.
      ?synonym rdfs:label ?label.
    } LIMIT 100
    

    在 Java 世界中,可以使用 JenaSesame 框架。

    【讨论】:

    • 如果我将 'run' 替换为 'bicycle',结果我得到了自行车、自行车、自行车,还有车轮和踏板
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-21
    相关资源
    最近更新 更多