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时,才可以看到这一点。好的,来回帮助我得出了答案,谢谢你,你取得了进步。我不完全理解这一点,但我认为我可以消除这个循环。见下面的答案。