Python NLTK命名实体

2024-10-02 00:42:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我不熟悉NLTK。我有一个文本文件,其中包含关于药物及其副作用的文本。所以我需要提取药物名称和副作用的名称。在

为此我写了这段代码

import sys, re, nltk, pprint
x = "Allegra (fexofenadine hydrochloride) is an antihistamine used to 
     treat allergic symptoms of seasonal allergic rhinitis (sneezing, 
     runny nose, itchy or watery eyes), and urticaria (hives). Allegra is 
     available as a generic drug termed fexofenadine hydrochloride. 
     Allegra is used in adults and children (2 years and older for 
     allergies, 6 months and older for hives) for the control and 
     reduction of the above symptoms. Some common side effects of Allegra
     include GI symptoms of nausea or diarrhea, muscle or back discomfort
     or pain, sleepiness, and menstrual cramps."
data = nltk.word_tokenize(x)
tagged = nltk.pos_tag(data)
namedEnt = nltk.ne_chunk(tagged, binary=True)

我得到一个非常复杂的输出

^{pr2}$

现在这真的很困惑,因为我希望得到的是

  1. 快板
  2. 恶心
  3. 腹泻
  4. 肌肉或背部不适或疼痛
  5. 困倦
  6. 痛经

那么,我如何缩小范围,缩小到我正在寻找的数据呢?在


Tags: orandof名称forisused副作用
2条回答

作为一个有点特别的解决方案大纲,我建议添加noun phrase extraction和一个简单的启发式方法,只从包含“副作用”的第一句话(或者可能是一小组近义词)开始提取候选症状。这源于一个观察,即药品申报往往有一个相当严格的结构,首先描述药物的预期用途,然后是可能的副作用和其他注意事项。在

从候选症状中,您可以保留一个常见症状的目录,然后假设夹在两个已知症状之间的任何东西也是一个症状,因为它们往往只是一个逗号分隔的名词短语列表,其中一些短语之间可能有连词。在

你好像在问两个问题。首先,NLTK为您提供了一个树,但是您只对命名的实体感兴趣。您可以这样选择它们:

for subtree in t.subtrees(filter=lambda x: x.label() == 'NE'):
    print subtree.leaves()

然而,第二,这个输出显示Python只将您要寻找的答案之一标识为命名实体。这意味着你必须找到其他方法,而不是标准的neu chunk来得到你的答案。这里有很多选择。例如,您可以在自己的数据上训练一个新的命名实体标记器,其中所有适当的单词都被标记为命名实体。如果没有任何带标签的数据,可以使用WordNet这样的资源来查找每个单词或短语的语义类型,并且只保留属于“症状”的单词。或者,您可以使用语义向量(比如Google的word2vec)来识别句子中与参考词(如“疾病”)非常相似的所有单词。在

相关问题 更多 >

    热门问题