匹配python嵌套列表与(随机变量)

时间:2016-05-16 15:18:26

标签: python list python-2.7 pattern-matching match

我在字符串之间进行一些匹配。

t1 = '[go:VB, [like:IN, [i:PR]], [to:TO], [there:RB]]'
t2 = '[A, [like:IN, [B]], [to:TO], [C]]'

t1和t2都具有 X:Y

的形状

我称之为

X:

Y: 标记

我想让

t1 == t2

在这个例子中,如果我们说的话可以这样做:

for i in t1: 
    if i.tag in (‘NN’, ‘RB’, ‘JJ’,’ VB’, PN’):
        X:Y = #ANY ONE UPPER CASE VARIABLE

不能这样做,因为它们不是列表而我不能(eval)因为(:< / strong>)未在列表中接受

我做的小麦是我分裂(',')

t1 = t1.split(',')
t2 = t2.split(',')

现在新列表如下:

t1 = ['[go:VB', ' [like:IN', ' [i:PR]]', ' [to:TO]', ' [there:RB]]']
t2 = ['[A', ' [like:IN', ' [B]]', ' [to:TO]', ' [C]]']

现在

t1[0] == t2[0]   #return FALSE
t1[1] == t2[1]   #return TRUE
t1[2] == t2[2]   #return FALSE
t1[3] == t2[3]   #return TRUE
t1[4] == t2[4]   #return FALSE

我需要他们全部返回 TRUE 即使我将变量从(A)更改为任何一个大写字母(例如,Z,H,X)

我想考虑最后一个成员的最后一个成员以及之前只选择标记的内容

>>> t1[0]
'[go:VB'
# to select only the tag
>>> t1[0][-2:]
'VB' # << This is what I want

>>> t1[1]
' [like:IN'
# to select only the tag
>>> t1[1][-2:]
'IN'  # << This is what I want

>>> t1[2]
' [i:PR]]'
# to select only the tag 
>>> t1[1][-2:]
']]'   # << This is NOT what I want

我不知道该怎么做但是可能有用的东西,但我不知道如何适应它

>>> t1[0][-2:].isalpha()
True
>>> t1[1][-2:].isalpha()
True
>>> t1[2][-2:].isalpha()
False

1 个答案:

答案 0 :(得分:0)

以下是您的格式问题的快速解决方法 -

import itertools
t1 = '[go:VB, [like:IN, [i:PR]], [to:TO], [there:RB]]'
t2 = '[A, [like:IN, [B]], [to:TO], [C]]'
t1=t1.replace("]","")
t1=t1.replace("[","")
t2=t2.replace("[","")
t2=t2.replace("]","")
t1=t1.split(",")
t2=t2.split(",")
print(t1)
print(t2)
for i,j in itertools.zip_longest(t1,t2):
    if i[-2:]==j[-2:]:
        print("true")
    else:
        print("false")

输出是 -

['go:VB', ' like:IN', ' i:PR', ' to:TO', ' there:RB']
['A', ' like:IN', ' B', ' to:TO', ' C']
false
true
false
true
false

但是,我不喜欢这种方法,我会解释原因。从部分代码中我可以理解你正在使用句子和词性标注(POS)。我将通过帮助您生成实际可读的POS列表来解决您的问题。我在python中使用 NLTK 模块,这是一个功能强大的自然语言处理工具(对结构化数据进行过培训)您可以找到文档here

import nltk
import itertools
from nltk import tokenize
from nltk.tokenize import *
text1= word_tokenize("And now for something completely different")
text2= word_tokenize("And won for something completely same")
t1=nltk.pos_tag(text1)
t2=nltk.pos_tag(text2)
print(t1)
print(t2)

for i ,j in itertools.zip_longest( t1,t2 ):
    if i[1]==j[1]:
        print("true")
    else:
        print("false")

这就是输出。

[('And', 'CC'), ('now', 'RB'), ('for', 'IN'), ('something', 'NN'), ('completely', 'RB'), ('different', 'JJ')]
[('And', 'CC'), ('won', 'VBD'), ('for', 'IN'), ('something', 'NN'), ('completely', 'RB'), ('same', 'JJ')]
true
false
true
true
true
true

密切注意输出,最后一个真实的原因是它们都是形容词。让我尽可能简单地解释一下代码。现在你可以看到,word_tokenize()是一种打破的方法将句子放入其各自的标记中(尝试使用“不能”这样的词语,并查看会发生什么)并pos_tag()执行POS标记。我确定你知道这一点。注意 - 这里,“:”默认用“,”代替。因此,可以更容易区分单词和标签。这个模块不仅可以帮助您进行格式化,而且非常强大。您可以训练数据,提取实体并大幅提高工作质量。

但是,注意到你的句子中存在变量(我想知道它们来自哪里),我建议迭代列表中的每个项目并跳过变量(因为你希望它们给出一个TRUE输出无论如何)。然后,简单地比较T1和T2之间的单词的标签。