我在字符串之间进行一些匹配。
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
答案 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之间的单词的标签。