python文本处理:从单个单词中识别名词

时间:2018-11-06 22:09:07

标签: python text nlp nltk pos-tagger

我有一个单词列表,只想保留名词。

这不是Extracting all Nouns from a text file using nltk

的副本

在链接的问题中,将处理一段文本。接受的答案提出了一个标记器。我知道用于标记文本的不同选项(nlkt,textblob,spacy),但是我无法使用它们,因为我的数据不包含句子。我只有一个单词列表:

would
research
part
technologies
size
articles
analyzes
line

nltk具有多种语料库。我发现verbnet带有完整的动词列表。但是到目前为止,我没有看到与名词相似的东西。是否有类似字典的内容,如果单词是名词,动词,形容词等,我可以在其中查找吗?

这可以通过某些在线服务来完成。例如,Microsoft翻译在其回复中返回了很多信息:https://docs.microsoft.com/en-us/azure/cognitive-services/translator/reference/v3-0-dictionary-lookup?tabs=curl 但这是一项付费服务​​。我希望有一个python包。

关于单词的歧义:理想情况下,我想要一本字典,该词典可以告诉我单词可以具有的所有功能。例如,“鱼”既是名词又是动词。 “吃”仅是动词,“狗”仅是名词。我知道这不是一门精确的科学。一个可行的解决方案将只是删除所有不能为名词的单词。

4 个答案:

答案 0 :(得分:1)

即使您使用字典,也将始终要处理歧义,例如,根据上下文,相同的单词可以是nounverb,单词{{ 1}}

  

政府将投资research

     

目标是research POS标记的新技术。

大多数词典对research的定义不只一个,例如:

research as a noun

research as a verb

这些词是从哪里来的,您能否在它们出现的上下文中对它们进行标记?

答案 1 :(得分:1)

您可以在单个片段上运行POS标记器,它的准确性较低,但我想这已经是已知的了。

理想情况下,找到一个POS标记器,该标记器稍后会在处理管道中显示所有可能的读数,以消除语法上的歧义。基本上,这只是从词典中挑选出所有可能的读数(也许有一定的可能性),然后再从那里获取。

答案 2 :(得分:0)

正如@Triplee和@DavidBatista指出的那样,仅凭单词本身来判断一个单词是名词还是动词真的很复杂,因为在大多数语言中,单词的语法取决于上下文。

单词只是意义的表示。因此,我想添加另一个可能符合您的意思的命题-与其尝试找出一个单词是名词还是动词,不如找出一个概念是一个对象还是一个动作,而不是试图找出一个概念。由于概念可以同时包含动作或对象形式,因此存在模棱两可的问题。

但是,您可以坚持只具有对象属性的概念(例如TypeOf,HasAsPart,IsPartOf等)或同时具有对象和动作属性的概念(例如子事件,效果,Requires等动作属性)。

Conceptnet是一个很好的概念搜索工具,它提供了一个WebApi来通过关键字在其网络中搜索概念(它基于Wikipedia和许多其他站点,并且对于英语非常完整),已经开放并指向其他语言中的同义词(被标记为它们的公共POS-您可以对同义词的POS求平均以尝试找出单词是对象(类似于名词)还是动作(类似于动词))

答案 3 :(得分:0)

尝试使用wordnet吗?

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense_1 (Dense)              (None, 64)                50240     
_________________________________________________________________
dense_2 (Dense)              (None, 10)                650       
=================================================================
Total params: 50,890
Trainable params: 50,890
Non-trainable params: 0
_________________________________________________________________

您应该看到:

from nltk.corpus import wordnet
words = ["would","research","part","technologies","size","articles","analyzes","line"]
for w in words:
    syns = wordnet.synsets(w)
    print(w, syns[0].lexname().split('.')[0]) if syns else (w, None)