【问题标题】:How to use words directly in nltk grammar如何在 nltk 语法中直接使用单词
【发布时间】:2018-08-09 06:14:19
【问题描述】:

我正在尝试使用 python NLTK 从给定的德国地址中提取公司名称。 这是我使用的代码,

import nltk

address="CompanyName GmbH * Keltenstr. 16 * 123456 Kippenheim * Deutschland"
tokens = nltk.word_tokenize(address)
textTokens = nltk.Text(tokens)
POStagList = nltk.pos_tag(textTokens)
print(POStagList)

grammar = """
        NP: 
            {<NN.?|JJ|FW>GmbH}"""


cp = nltk.RegexpParser(grammar)
result = cp.parse(POStagList)

for subtree in result.subtrees(filter=lambda t: t.label() == 'NP'):
   print("NP Subtree:", subtree)

我需要输出:CompanyName GmbH

有时可能是 corpInc.llc 等而不是 GmbH

如何解决?

如何在语法中直接使用字符串值和转义序列字符?

【问题讨论】:

  • 有效吗?究竟是什么问题?
  • 你不能简单地将字符串拆分为* 字符并使用第一项吗?
  • 它不工作。我需要正确的语法才能获得结果“CompanyName GmbH”
  • 您能解释一下如何它不起作用吗?你得到什么而不是CompanyName GmbH?有错误信息吗?
  • 我需要使用语法得到结果。对于另一种地址格式,我需要更多语法

标签: regex python-3.x nltk


【解决方案1】:

除了将语法与文字字符串混合之外,您还可以使用正则表达式的变通方法:使用 POS 标记标记,然后仅在已知单词之前获取您需要的标记(例如 GmbH)。

代码如下所示

import nltk
import re
address="CompanyName GmbH * Keltenstr. 16 * 123456 Kippenheim * Deutschland"
tokens = nltk.word_tokenize(address)
textTokens = nltk.Text(tokens)
POStagList = nltk.pos_tag(textTokens)
joined = ' '.join(["{}<{}>".format(word,tag) for word,tag in POStagList])
grammar = r'NN[^>]?|JJ|FW' # regex! 
print([re.sub("<(?:{})>".format(grammar), "", x.strip()) for x in re.findall(r'((?:\S+<(?:{0})> )+)(?:GmbH|Inc|corp|llc)<(?:{0})>'.format(grammar), joined)])

输出:['CompanyName']

这里,语法是使用像NN[^&gt;]?|JJ|FW 这样的正则表达式指定的,其中[^&gt;]? 匹配除&gt; 之外的任何字符(只是为了确保我们不匹配&gt;,就像. 那样)。之后,((?:\S+&lt;(?:NN[^&gt;]?|JJ|FW)&gt; )+)(?:GmbH|Inc|corp|llc)&lt;(?:NN[^&gt;]?|JJ|FW)&gt; 正则表达式将找到您需要的所有匹配项,但由于它们包含标签,因此必须使用 re.sub 删除它们,而仅使用 &lt;(?:NN[^&gt;]?|JJ|FW)&gt; 正则表达式。

主要的正则表达式细节:

  • ((?:\S+&lt;(?:NN[^&gt;]?|JJ|FW)&gt; )+) - 第 1 组:一个或多个 1+ 非空白字符序列,后跟 &lt;,然后是 NN + 除 &gt;JJFW 之外的任何 1 或 0 个字符,以及然后是&gt;,然后是一个空格
  • (?:GmbH|Inc|corp|llc) - 任何选择:GmbHInccorpllc
  • &lt;(?:NN[^&gt;]?|JJ|FW)&gt; - &lt;NN + 除&gt;JJFW 以外的任何 1 或 0 个字符。

【讨论】:

    猜你喜欢
    • 2020-03-30
    • 2015-05-19
    • 2014-12-05
    • 2013-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多