python组单词搜索是递归实现的。如何进行?

时间:2018-12-19 15:12:20

标签: python recursion scikit-learn text-mining

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

"blue 5 house" >>>意味着我必须找到在blue中出现单词housedistance of 5 or less words的匹配项。 "little 3 cat"然后意味着找到在little内出现单词catdistance 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)

1 个答案:

答案 0 :(得分:1)

该解决方案的主要观察结果:

  • 当我们从标记到“概念”的飞跃时,我们需要范围而不是索引。
  • 我们需要定义一个函数来找到两个概念之间的“距离”,即它们对应的范围。 (下面的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))

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