递归实现的python单词组搜索.如何继续



我必须在文本中寻找概念。这些概念以以下方式表示:

"blue 5 house">>意味着我必须找到单词bluehouse出现在distance of 5 or less words中的命中率。则CCD_ 5将意味着找到单词littlecat出现在distance of max 3 words内的命中。(即"小猫"、"烦人的小猫",但不是"我奶奶的猫很小"(

我想你明白了。

到目前为止,我有一个(不是很复杂的(代码如下。我刚刚实现了两个嵌套循环,遍历文本中的所有单词,当第一个单词命中时,开始在周围的单词中寻找另一个,并将结果添加到列表中:

with open('applicationtext.txt', 'r') as f:
content=f.read()
# content = ' Lorem ipsum dolor sit amet, consectetur (23) adipiscing elit, sed do ( 23 , 45 ) eiusmod ( 23, 45 ) tempor incididunt ut  '
# Note: the text contains several times: "sit amet eros vestibulum"
elasticTerm1="sit"
elasticTerm2="vestibulum"
distance=5
content=content.strip()
# replace all the line breaks and two spaces.
content = content.replace('n', ' ').replace('r', '').replace('  ',' ')
listofHits=[]
content_tokenized = content.split(" ")
for i,word in enumerate(content_tokenized):
if word==elasticTerm1:
for j in range(distance):
if content_tokenized[i+j]==elasticTerm2:
# I got a hit
position1=i
myhitTupple=(i,elasticTerm1)
listofHits.append(myhitTupple)
for i,tupple in enumerate(listofHits):
print(tupple)

到目前为止还可以。

想象一下,我正在考虑如何在此基础上构建递归代码,这将给我带来以下命中率:

(little 3 cat) 4 third_word甚至concept1 5 concept2;其中concept1=("blue 3 cat")concept2=("little 4 dollar")???

我该怎么想?上课?这已经包含在scikit-learn中了吗?不仅仅是一个代码(我想这会很复杂(,我在问你方向。如何递归地思考用代码解决的问题。

感谢

注1:请忘记"小猫"与"小猫"的顺序,这是另一个问题。

注2:(在第一个答案之后(请注意,这是一个非常简单的情况,实际上我看到的是这样的情况:((concept1 n1 concept2) n2 concept 3)) n3 (concept1 n4 concept 5)

解决方案的关键观察结果:

  • 当我们从标记到"概念"时,我们需要范围而不是索引
  • 我们需要定义一个函数来找到两个概念之间的"距离",即它们对应的范围。(下文dist(
  • 组合概念的另一个功能,即它们的范围。(下文comb(

现在在我们的主要递归函数中,我们首先找出这两个概念的所有出现。然后我们可以简单地找到距离小于指定距离的对。在这个实现中,我们的主hits()采用了一个"概念":它要么是基本格中的一个单词,要么是一个有两个概念的三元元组,int指定了它们之间的最大可能距离。该函数的输出是一个范围数组,其中每个范围都包含最大距离内的两个概念。这个数组可以被认为是输入概念的所有出现。

这是完整的代码。

#Find distance between two concept's ranges
#ex1: dist([2,9],[11,13]) = 2
#ex2: dist([2,9],[4,99]) = 0
def dist(r1,r2):
#check for overlap
if r2[0]<=r1[0]<=r2[1] or r1[0]<=r2[0]<=r1[1]:
return 0
return max(r1[0],r2[0]) - min(r1[1],r2[1])
#Combine two concept's ranges
#ex1: comb([1,3],[6,9]) = [1,9]
#ex2: comb([4,11],[1,7]) = [1,11]
def comb(r1,r2): 
return [min(r1[0],r2[0]),max(r1[1],r2[1])]
def hits(concept):
if type(concept)==str:
return [(i,i) for i,w in enumerate(tokens) if w==concept]
c1,c2,R = concept
ans = []
for r1 in hits(c1):
for r2 in hits(c2):
if dist(r1,r2)<=R:
ans.append(comb(r1,r2))
return ans

为了测试这一点,情况1:(此输出[[0-9]](

tokens = "python group of words search implemented recursively How to proceed".split()
c1 = ("python","words",3)
c2 = ("recursively","proceed",4)
print(hits((c1,c2,3))) 

情况2:(输出[0-8]](

c1 = ("python","of",3)
c2 = ("search","recursively",4)
print(hits(((c1,c2,3),"to",3)))

情况3:(输出[0,3],[6,8]](

tokens = "A B B X C C X Q A W".split()
c1 = ("A","X",4)
print(hits(c1))

为了提高性能,对递归的基本情况进行预处理。

最新更新