我必须在文本中寻找概念。这些概念用以下方式表示:
"blue 5 house"
>>>意味着我必须找到在blue
中出现单词house
和distance of 5 or less words
的匹配项。
"little 3 cat"
然后意味着找到在little
内出现单词cat
和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)
答案 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))
为了提高性能,请预处理递归的基本情况。