2017-07-06 17 views
1

我对python(使用python 3)和spacy(以及编程)很感兴趣。请多多包涵。句子分割和依赖关系解析器

我有三个问题,其中两个差不多都是一样的我只是无法让它工作。 我把“语法特定的搜索与空间”(example),并试图使不同的事情工作。

我的计划目前读取TXT和正常提取

if w.lower_ != 'music': 
return False 

作品。

我的第一个问题是:我怎样才能提取两个单词? 例如:“古典音乐” 与前面提到的片段,我可以使其提取古典或音乐。但是,如果我只搜索其中一个词,我也会得到结果,我不想要。

古典 - 时期/时代

或者当我看只有音乐

音乐 - 巴洛克风格,现代

第二个问题是:我怎样才能获得依赖工作?

与示例依赖:

elif w.dep_ != 'nsubj': # Is it the subject of a verb? 
return False 

工作正常。但我尝试过的其他东西并不真正起作用。

例如,我想提取单词“birthday”和相关性“DATE”的句子。 (这样的依赖是一个实体)

if d.ent_type_ != ‘DATE’: 
return False 

工作。

所以现在它看起来像:

def extract_information(w,d): 
if w.lower_ != ‘birthday’: 
return False 
elif d.ent_type_ != ‘DATE’: 
return False 
else: 
return True 

难道这样的事情,甚至工作?

如果有效,第三个问题就是我如何用DATE过滤句子。所以如果句子包含某个词并且DATE排除它。

最后一件事可能是,我在某处读到依赖关系是基于“斯坦福类型依赖手册”的。有没有一个列表哪些依赖与空间工作?

感谢您的耐心和帮助:)

回答

0

在我进入提供一些简单的建议,你的问题,你尝试过在你的一些句子的使用displaCy的visualiser

使用例句'John的生日是昨天',你会发现在解析的句子中,生日和昨天不一定是彼此的直接依赖关系。因此,基于具有DATE类型实体依赖性的生日词进行搜索可能不会产生最好的结果。

对第一个问题: 蛮力方法是在解析句子后查找匹配的后续的单词。

doc = nlp(u'Mary enjoys classical music.') 

for (i,token) in enumerate(doc): 
    if (token.lower_ == 'classical') and (i != len(doc)-1):    
     if doc[i+1].lower_ == 'music': 
      print 'Target Acquired!' 

如果您不确定枚举的作用,请查看它。这是使用Python的pythonic方式。

对于问题2和问题3,解决这个问题的一个简单(但不是优雅的)方法是只在被分析的句子中识别单词'birthday'是否存在,以及它是否包含类型为'DATE'的实体。

doc = nlp(u'John\'s birthday was yesterday.') 

for token in doc: 
    if token.lower_ == 'birthday': 
     for entities in doc.ents: 
      if entities.label_ == 'DATE': 
       print 'Found ya!' 

至于依赖关系的列表,我假定你指的是词性标签。看看这个page的文档。

祝你好运!希望有所帮助。

+0

感谢您的快速帮助,我现在只有时间来测试它。替代视觉是一个很好的提示,告诉我,我对一个句子的理解不像spacys :)我试过你的方法,他们自己工作。意思是:我不能让他们在我的程序中工作(对不起) DATE命令不幸与前面的语句不相关,所以它会列出所有找到的日期。你知道如何解决这个问题吗? 其次,我的打印命令是'for word in document_read: if extract_information(word):print(''。join(w.string for w.in word.head.subtree).strip())' – My3vilMe

+0

我得到错误消息'extract_information()缺少1个需要的位置参数'。因为我们用我作为第二个参数是可以理解的。但如果我包括我 - >'extract_information(单词,我)'我得到错误消息'名称'我'没有定义'也可以理解,但我不知道如何定义它,并将其包含在'print ''.join(w.string for w in word.head.subtree).strip()'。 我目前正试图解决它,所以我会更新,如果我自己得到它。再次感谢! – My3vilMe

+0

@ My3vilMe可以你分享/解释你试图达到的整个过程?我在上面的两条评论中很难理解你的想法,也许还提供了一个例子来说明你想要的例子。 – Albert