Regex 如何在nltk语法中直接使用单词
我正在尝试使用python 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
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即可
主要正则表达式详细信息:
-第1组:一个或多个1+非空白字符序列,后跟((?:\S+]?|JJ|FW)+)
,或
或JJ
,然后是FW
,然后是空格
-任何备选方案:(?:GmbH | Inc | corp | llc)
、GmbH
、Inc
或corp
llc
-]?|JJ | FW)>
,或
或JJ
FW
*
字符上的字符串并使用第一项吗?它不起作用。我需要正确的语法来获得“CompanyName GmbH”的结果。您能解释一下它是如何不起作用的吗?您能得到什么而不是CompanyName GmbH
?是否有错误消息?我需要使用语法获取结果。我需要更多的语法来获取另一种格式的地址