我正在Stata中进行文本搜索。
postid
我试图找到referencedtext
来自同一个帖子中的ref_postid
(即,谁是给定的海报引用)并创建一个表示引用的新变量postid
发帖referencedtext
。 text
可能包含它所引用的所有原始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
答案 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 |
+------------------------------------------------------------------------+