【发布时间】:2026-02-21 14:30:01
【问题描述】:
假设以下数据:
df <- data.frame(id = c(1:8),
text = c("i like", "i like to", "oops", "i like to and", "i like it not", "victoria", "victoria secret", "victoria secret is"))
我想做的是:
- 找出任何给定的较短字符串是否是一部分(更准确地说)是另一个字符串的开头
- 应用最小字符长度,例如字符串必须至少有 X 个字符(例如,我们将其设置为 5)
- 将信息添加到数据集中哪些字符串属于同一组。
我的想法是我可以根据文本响应和文本响应的长度对我的数据框进行排序,然后检查第一个字符串是否是任何后续字符串的一部分,然后我继续处理第二个字符串并检查它是否是后续的一部分,依此类推。这是一个计算的噩梦,所以我想知道是否有一种计算更有效的方法。我只是想也许首先分解成单词可能是有意义的,然后基于此进行比较? (比较完整的单词就可以了,不需要逐个字符比较)
此外,问题可能是任何更长的响应都可能是所有先前响应的一部分,这意味着需要存储的信息可能需要 n-1 列(或该长度的列表)。
简单地说:我的真实数据有大约 100.000 行。
我可以这样设想潜在的预期输出:
id text group_1 group_2 group_3
1 1 i like 1 1 0
2 2 i like to 1 0 0
3 3 oops 0 0 0
4 4 i like to and 1 0 0
5 5 i like it not 0 1 0
6 6 victoria 0 0 1
7 7 victoria secret 0 0 1
8 8 victoria secret is 0 0 1
注意,如果某些字符串至少有两行资格,我只需要一列。所以在这种情况下,我不想/不需要为“oops”文本添加组变量。
- 文本 1、2、4 属于一起,因为它们都以“我喜欢”开头并且它们“按顺序”构建,即第二个文本也是第四个文本的一部分。
- 第 1 行和第 5 行也属于同一行,因为文本 1 是文本 5 的一部分。
- 第 6 行到第 8 行也属于一起,原因与文本 1、2、4 属于一起的原因相同(它们相互叠加)。
或者,作为第一步,我还可以使用一个输出,如果某个文本是另一个文本的一部分,它只会给我提供信息,因此在示例中,只需将 1 分配给除“oops”之外的所有文本。
【问题讨论】:
-
这是第 8 行的错字吗?
-
是的。感谢举报。将修复它....完成。
-
使用prefix trees可以有效解决这类问题——似乎有一些R实现。
-
感谢您的建议。谷歌搜索并没有在这个问题上出现很多。我找到了 triebeard 包,会试一试。