R unnest_token() v.s Python pandas str.split() 中的正则表达式行为
Regular Expression Behavior in R unnest_token() v.s Python pandas str.split()
我想使用 python pandas 复制类似于下面 df_long 的结果。这是 R 代码:
df <- data.frame("id" = 1, "author" = 'trump', "Tweet" = "RT @kin2souls: @KimStrassel Anyone that votes")
unnest_regex <- "([^A-Za-z_\d#@']|'(?![A-Za-z_\d#@]))"
df_long <- df %>%
unnest_tokens(
word, Tweet, token = "regex", pattern = unnest_regex)
如果我没理解错的话,unnest_regex 的书写方式也能找到数字(在空格和少量标点符号中)。我不明白为什么 R 会将字符串中的数字(例如“@kin2souls”)视为不匹配条件。因此,我们在 df_long 中得到了一个结果,@kin2souls 单独成一行。但是,当我尝试在 pandas:
中复制它时
unnest_regex = r"([^A-Za-z_\d#@']|'(?![A-Za-z_\d#@]))"
df = df_long.assign(word=df['Tweet'].str.split(unnest_regex)).explode('word')
df.drop("Tweet", axis=1, inplace=True)
它会将“@kin2souls”字符串拆分为“@kin”和“souls”作为单独的行。另外,由于unnest_regex使用了捕获括号,在Python中,我修改为:
unnest_regex = r"[^A-Za-z_\d#@']|'(?![A-Za-z_\d#@])"
这是为了避免出现空字符串。我想知道这是否也是一个促成因素。但是,“2”处的分裂仍然发生。任何人都可以在 Python 中提出解决方案并可能解释为什么 R 会这样吗?谢谢!
这是Python中的数据:
data = {'id':[1], "author":["trump"], "Tweet": ["RT @kin2souls: @KimStrassel Anyone that votes"]}
df = pd.DataFrame.from_dict(data)
预期结果:
data_long = {'id':[1,1,1,1,1,1], "author":["trump","trump","trump","trump","trump","trump"], "word": ["rt", "@kin2souls", "@kimstrassel", "anyone", "that", "votes"]}
df_long = pd.DataFrame.from_dict(data_long)
str split and explode 的组合应该复制您的输出:
(df
.assign(Tweet=df.Tweet.str.lower().str.split(r"[:\s]"))
.explode("Tweet")
.query('Tweet != ""')
.reset_index(drop=True)
)
id author Tweet
0 1 trump rt
1 1 trump @kin2souls
2 1 trump @kimstrassel
3 1 trump anyone
4 1 trump that
5 1 trump votes
我利用了文本由 space 分隔的事实,偶尔 :
或者,您可以使用 str extractall - 我觉得它有点长 :
(
df.set_index(["id", "author"])
.Tweet.str.lower()
.str.extractall(r"\s*([a-z@\d]+)[:\s]*")
.droplevel(-1)
.rename(columns={0: "Tweet"})
.reset_index()
)
不确定 unnest_token
如何使用正则表达式 - 也许其他人可以解决这个问题
我想使用 python pandas 复制类似于下面 df_long 的结果。这是 R 代码:
df <- data.frame("id" = 1, "author" = 'trump', "Tweet" = "RT @kin2souls: @KimStrassel Anyone that votes")
unnest_regex <- "([^A-Za-z_\d#@']|'(?![A-Za-z_\d#@]))"
df_long <- df %>%
unnest_tokens(
word, Tweet, token = "regex", pattern = unnest_regex)
如果我没理解错的话,unnest_regex 的书写方式也能找到数字(在空格和少量标点符号中)。我不明白为什么 R 会将字符串中的数字(例如“@kin2souls”)视为不匹配条件。因此,我们在 df_long 中得到了一个结果,@kin2souls 单独成一行。但是,当我尝试在 pandas:
中复制它时unnest_regex = r"([^A-Za-z_\d#@']|'(?![A-Za-z_\d#@]))"
df = df_long.assign(word=df['Tweet'].str.split(unnest_regex)).explode('word')
df.drop("Tweet", axis=1, inplace=True)
它会将“@kin2souls”字符串拆分为“@kin”和“souls”作为单独的行。另外,由于unnest_regex使用了捕获括号,在Python中,我修改为:
unnest_regex = r"[^A-Za-z_\d#@']|'(?![A-Za-z_\d#@])"
这是为了避免出现空字符串。我想知道这是否也是一个促成因素。但是,“2”处的分裂仍然发生。任何人都可以在 Python 中提出解决方案并可能解释为什么 R 会这样吗?谢谢!
这是Python中的数据:
data = {'id':[1], "author":["trump"], "Tweet": ["RT @kin2souls: @KimStrassel Anyone that votes"]}
df = pd.DataFrame.from_dict(data)
预期结果:
data_long = {'id':[1,1,1,1,1,1], "author":["trump","trump","trump","trump","trump","trump"], "word": ["rt", "@kin2souls", "@kimstrassel", "anyone", "that", "votes"]}
df_long = pd.DataFrame.from_dict(data_long)
str split and explode 的组合应该复制您的输出:
(df
.assign(Tweet=df.Tweet.str.lower().str.split(r"[:\s]"))
.explode("Tweet")
.query('Tweet != ""')
.reset_index(drop=True)
)
id author Tweet
0 1 trump rt
1 1 trump @kin2souls
2 1 trump @kimstrassel
3 1 trump anyone
4 1 trump that
5 1 trump votes
我利用了文本由 space 分隔的事实,偶尔 :
或者,您可以使用 str extractall - 我觉得它有点长 :
(
df.set_index(["id", "author"])
.Tweet.str.lower()
.str.extractall(r"\s*([a-z@\d]+)[:\s]*")
.droplevel(-1)
.rename(columns={0: "Tweet"})
.reset_index()
)
不确定 unnest_token
如何使用正则表达式 - 也许其他人可以解决这个问题