如何不将"王"全称为"国王"?

mat*_*yd2 4 python regex nlp

如何验证字符串中出现的确切单词?

我需要说明"king"这样的单词后面紧跟着问号的情况,如下例所示.

unigrams这应该是假的

In [1]: answer = "king"
In [2]: context = "we run with the king? on sunday"
Run Code Online (Sandbox Code Playgroud)

n_grams这应该是假的

In [1]: answer = "king tut"
In [2]: context = "we run with the king tut? on sunday"
Run Code Online (Sandbox Code Playgroud)

unigrams这应该是真的

In [1]: answer = "king"
In [2]: context = "we run with the king on sunday"
Run Code Online (Sandbox Code Playgroud)

n_grams这应该是真的

In [1]: answer = "king tut"
In [2]: context = "we run with the king tut on sunday"
Run Code Online (Sandbox Code Playgroud)

正如人们提到的,对于unigram情况,我们可以通过将字符串拆分为列表来处理它,但这对n_grams不起作用.

看完一些帖子后,我想我应该试着用后面的方式处理,但我不确定.

Tem*_*olf 5

return answer in context.split():

>>> answer in context.split()
False
Run Code Online (Sandbox Code Playgroud)

你不需要正则表达式.

如果您正在寻找关键字:

all([ans in context.split() for ans in answer.split()])
Run Code Online (Sandbox Code Playgroud)

将使用"king tut",但这取决于你是否想要匹配字符串,如:

"we tut with the king"
Run Code Online (Sandbox Code Playgroud)

如果你不这样做,你仍然不需要一个正则表达式(虽然你应该使用一个),因为你只想考虑整个术语(默认情况下,通过正确分割.split()):

def ngram_in(match, string):
    matches = match.split()
    if len(matches) == 1:
        return matches[0] in string.split()
    words = string.split()
    words_len = len(words)
    matches_len = len(matches)
    for index, word in enumerate(words):
        if index + matches_len > words_len:
            return False
        if word == matches[0]:
            for match_index, match in enumerate(matches):
                potential_match = True
                if words[index + match_index] != match:
                    potential_match = False
                    break
            if potential_match == True:
                return True
    return False
Run Code Online (Sandbox Code Playgroud)

这是O(n*m)最坏情况下的字符串,大约是正常字符串上正则表达式的一半.

>>> ngram_in("king", "was king tut a nice dude?")
True
>>> ngram_in("king", "was king? tut a nice dude?")
False
>>> ngram_in("king tut a", "was king tut a nice dude?")
True
>>> ngram_in("king tut a", "was king tut? a nice dude?")
False
>>> ngram_in("king tut a", "was king tut an nice dude?")
False
>>> ngram_in("king tut", "was king tut an nice dude?")
True
Run Code Online (Sandbox Code Playgroud)

  • 谢谢@TemporalWolf.我将更新帖子以解决另一个案例,当这不起作用. (2认同)