在单元格中查找文本

时间:2017-10-31 20:32:28

标签: nlp stata

我正在Stata中进行文本搜索。

postid

我试图找到referencedtext来自同一个帖子中的ref_postid(即,谁是给定的海报引用)并创建一个表示引用的新变量postid发帖referencedtexttext可能包含它所引用的所有原始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 } ,或仅包含一部分。也可能存在资本化差异,因此处理这些差异会很有帮助。

这就是我使用的:

someObj

2 个答案:

答案 0 :(得分:0)

感谢尼克的一些来回,这个解决方案有效。使用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 != ""
}

答案 1 :(得分:0)

这是尝试在没有循环的情况下从@ 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 |
     +------------------------------------------------------------------------+