Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何在nltk语法中直接使用单词_Regex_Python 3.x_Nltk - Fatal编程技术网

Regex 如何在nltk语法中直接使用单词

Regex 如何在nltk语法中直接使用单词,regex,python-3.x,nltk,Regex,Python 3.x,Nltk,我正在尝试使用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(POSta

我正在尝试使用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)
导入nltk
地址=“公司名称股份有限公司*Keltenstr.16*123456 Kippenheim*德国”
tokens=nltk.word\u标记化(地址)
textTokens=nltk.Text(标记)
POStagList=nltk.pos_标记(文本标记)
印刷品(邮资英语)
语法=”“
NP:
{GmbH}”“”
cp=nltk.RegexpParser(语法)
结果=cp.parse(后英语)
对于result.subtrees中的子树(filter=lambda t:t.label()=='NP'):
打印(“NP子树:”,子树)
我需要输出:CompanyName GmbH

有时,它可能不是股份有限公司,而是公司或股份有限公司或有限责任公司等

如何解决这个问题


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

不要将语法与文字字符串混合使用,您可以使用一种使用regex的变通方法:用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)])
导入nltk
进口稀土
地址=“公司名称股份有限公司*Keltenstr.16*123456 Kippenheim*德国”
tokens=nltk.word\u标记化(地址)
textTokens=nltk.Text(标记)
POStagList=nltk.pos_标记(文本标记)
join='''.join([“{}.format(word,tag)表示word,PostalGlist中的tag])
语法=r'NN[^>]?| JJ | FW'#regex!
打印([re.sub(“.format(grammar)”,x.strip())用于x在re.findall(r'((?:\S++)+(:GmbH | Inc | corp | llc).格式(grammar),加入)])
输出:
['CompanyName']

这里,语法是使用类似于
NN[^>]?|JJ | FW
的正则表达式指定的,其中
[^>]?
匹配任何字符,但
(只是为了确保我们不匹配
,就像
那样)。之后,regex将找到您需要的所有匹配项,但由于它们包含标记,因此必须使用
re.sub
删除它们,只需
]?|JJ | FW)>
regex即可

主要正则表达式详细信息:

  • ((?:\S+]?|JJ|FW)+)
    -第1组:一个或多个1+非空白字符序列,后跟
    ,或
    JJ
    FW
    ,然后是
    ,然后是空格
  • (?:GmbH | Inc | corp | llc)
    -任何备选方案:
    GmbH
    Inc
    corp
    llc
  • ]?|JJ | FW)>
    -
    ,或
    JJ
    FW

它有效吗?到底是什么问题?你不能简单地拆分
*
字符上的字符串并使用第一项吗?它不起作用。我需要正确的语法来获得“CompanyName GmbH”的结果。您能解释一下它是如何不起作用的吗?您能得到什么而不是
CompanyName GmbH
?是否有错误消息?我需要使用语法获取结果。我需要更多的语法来获取另一种格式的地址