Nlp 在单元格中查找文本

Nlp 在单元格中查找文本,nlp,stata,Nlp,Stata,我正在斯塔塔玩一个文本查找练习 clear input id postid str7 text str3 referencedtext ref_postid 1 1 "XYZ ABC" "" . 1 2 "BCD ABC" "ABC" 1 1 3 "DCE" "" . 2 1 "XYZ" "" . 2 2 "ABC" "" . 2 3 "JKL" "" . 2 4 "JKL DEF" "JKL" 3 end 我试图在referencedtext来自同一个线程的postid中找到什么(即,谁

我正在斯塔塔玩一个文本查找练习

clear 
input id postid str7 text str3 referencedtext ref_postid
1 1 "XYZ ABC" "" .
1 2 "BCD ABC" "ABC" 1
1 3 "DCE" "" .
2 1 "XYZ" "" .
2 2 "ABC" "" .
2 3 "JKL" "" .
2 4 "JKL DEF" "JKL" 3
end 
我试图在
referencedtext
来自同一个线程的
postid
中找到什么(即,谁是给定的海报引用),并创建一个新变量
ref\u postid
,表示引用的帖子的
postid
referencedtext
可以包括其引用的所有原始
文本,也可以仅包括一个片段。也可能存在资本化差异,因此处理这一问题会有所帮助

这就是我使用的:

gen ref_postid = .
qui bys id (postid) : sum postid
local postidmax= r(max) 
qui forval i = 1/`postidmax' { 
    bys id (postid): replace ref_postid = postid[_n-`i'] if referencedtext == text[_n-`i'] & referencedtext != "" & postid != 1
}

多亏了与Nick的交流,这个解决方案才有效。使用
strpos
有助于消除精确匹配的需要,将文本减少为小写有助于最大限度地匹配。不过,根据文本长度的不同,最好用精确匹配要求来代替

replace text = lower(text)
replace referencedtext = lower(referencedtext)
gen ref_postid = .
qui su postid
local maxposts = r(max) 
forval i = 1/`maxposts' {
    qui bys id (postid) : replace ref_postid = postid[_n-`i'] if strpos(text[_n-`i'],referencedtext) >= 1 & postid != 1 & referencedtext != ""
}

多亏了与Nick的交流,这个解决方案才有效。使用
strpos
有助于消除精确匹配的需要,将文本减少为小写有助于最大限度地匹配。不过,根据文本长度的不同,最好用精确匹配要求来代替

replace text = lower(text)
replace referencedtext = lower(referencedtext)
gen ref_postid = .
qui su postid
local maxposts = r(max) 
forval i = 1/`maxposts' {
    qui bys id (postid) : replace ref_postid = postid[_n-`i'] if strpos(text[_n-`i'],referencedtext) >= 1 & postid != 1 & referencedtext != ""
}

这是一次试图在没有循环的情况下重写@CJ12的答案的尝试。它复制了请求的解决方案。它是否打破了其他一些假设仍有待评论

clear 
input id postid str7 text str3 referencedtext 
1 1 "XYZ ABC" "" 
1 2 "BCD ABC" "ABC" 
1 3 "DCE" "" 
2 1 "XYZ" "" 
2 2 "ABC" "" 
2 3 "JKL" "" 
2 4 "JKL DEF" "JKL" 
end 

gen text2 = lower(text)
bysort id (referenced): gen refer2 = lower(referenced[_N])
gen found = strpos(text2, refer2) > 0 
gsort id -found postid 
by id: gen ref_postid = postid[1] if found 
replace ref_postid = . if missing(referenced) 
sort id postid 

list, sepby(id) 

     +------------------------------------------------------------------------+
     | id   postid      text   refere~t     text2   refer2   found   ref_po~d |
     |------------------------------------------------------------------------|
  1. |  1        1   XYZ ABC              xyz abc      abc       1          . |
  2. |  1        2   BCD ABC        ABC   bcd abc      abc       1          1 |
  3. |  1        3       DCE                  dce      abc       0          . |
     |------------------------------------------------------------------------|
  4. |  2        1       XYZ                  xyz      jkl       0          . |
  5. |  2        2       ABC                  abc      jkl       0          . |
  6. |  2        3       JKL                  jkl      jkl       1          . |
  7. |  2        4   JKL DEF        JKL   jkl def      jkl       1          3 |
     +------------------------------------------------------------------------+

这是一次试图在没有循环的情况下重写@CJ12的答案的尝试。它复制了请求的解决方案。它是否打破了其他一些假设仍有待评论

clear 
input id postid str7 text str3 referencedtext 
1 1 "XYZ ABC" "" 
1 2 "BCD ABC" "ABC" 
1 3 "DCE" "" 
2 1 "XYZ" "" 
2 2 "ABC" "" 
2 3 "JKL" "" 
2 4 "JKL DEF" "JKL" 
end 

gen text2 = lower(text)
bysort id (referenced): gen refer2 = lower(referenced[_N])
gen found = strpos(text2, refer2) > 0 
gsort id -found postid 
by id: gen ref_postid = postid[1] if found 
replace ref_postid = . if missing(referenced) 
sort id postid 

list, sepby(id) 

     +------------------------------------------------------------------------+
     | id   postid      text   refere~t     text2   refer2   found   ref_po~d |
     |------------------------------------------------------------------------|
  1. |  1        1   XYZ ABC              xyz abc      abc       1          . |
  2. |  1        2   BCD ABC        ABC   bcd abc      abc       1          1 |
  3. |  1        3       DCE                  dce      abc       0          . |
     |------------------------------------------------------------------------|
  4. |  2        1       XYZ                  xyz      jkl       0          . |
  5. |  2        2       ABC                  abc      jkl       0          . |
  6. |  2        3       JKL                  jkl      jkl       1          . |
  7. |  2        4   JKL DEF        JKL   jkl def      jkl       1          3 |
     +------------------------------------------------------------------------+

@NickCox(1)和(2)是现在已修复的打字错误。(2) 最初不是一个问题,但发生了一个错误以帮助您理解。(3) 是一个编码问题,我愿意修复。(4) 是因为线程中的初始帖子如何引用线程中不存在的内容?(逻辑上不可能)。问题的案文从一开始就很清楚,我想这是一个普遍的问题issue@NickCox“问题的案文从一开始就很清楚”是我所作的发言。我没有对代码做过这样的声明。没有我的尝试(这显然不起作用),但我总是喜欢提供我自己的尝试,问题很清楚。至于(2)3是正确的答案,因为
id==2&postid==4
referencedtext==JKL
,只有在
id==2
中,当
postid==3
@NickCox时,才可以看到这一点。好的,来回帮助我得出了答案,谢谢你,你取得了进步。我不完全理解这一点,但我认为我可以消除这个循环。请参阅下面的答案。@NickCox(1)和(2)是现在已修复的打字错误。(2) 最初不是一个问题,但发生了一个错误以帮助您理解。(3) 是一个编码问题,我愿意修复。(4) 是因为线程中的初始帖子如何引用线程中不存在的内容?(逻辑上不可能)。问题的案文从一开始就很清楚,我想这是一个普遍的问题issue@NickCox“问题的案文从一开始就很清楚”是我所作的发言。我没有对代码做过这样的声明。没有我的尝试(这显然不起作用),但我总是喜欢提供我自己的尝试,问题很清楚。至于(2)3是正确的答案,因为
id==2&postid==4
referencedtext==JKL
,只有在
id==2
中,当
postid==3
@NickCox时,才可以看到这一点。好的,来回帮助我得出了答案,谢谢你,你取得了进步。我不完全理解这一点,但我认为我可以消除这个循环。见下面的答案。