【问题标题】:Text mining and extracting words文本挖掘和单词提取
【发布时间】:2018-09-21 18:46:52
【问题描述】:

我正在尝试从 R 中的 SQL 语句中提取表名。例如,我会将 SQL 查询导入 R,其中一行将包含:

SELECT A , B
FROM Table.1 p
JOIN Table.2 pv
ON p.ProdID.1 = ProdID.1
JOIN Table.3 v
ON pv.BusID.1 = v.BusID
WHERE SubID = 15
ORDER BY v.Name;

在 R 中,我一直在尝试将 strsplit 用于 SQL 语句,该语句将每个单词分成一列,创建一个数据框,然后找到与单词“from”的匹配项并提取下一个单词,即 Table .1.

我在如何从多个联接中提取其他表时遇到问题,或者是否有更有效的方法或我在研究期间没有遇到的包。任何帮助将不胜感激!

【问题讨论】:

标签: r text-mining text-extraction


【解决方案1】:

这是使用正则表达式的一种方式:

lines <- strsplit("SELECT A, B
                   FROM Table.1 p
                   JOIN Table.2 pv
                   ON p.ProdID.1 = ProdID.1
                   JOIN Table.3 v
                   ON pv.BusID.1 = v.BusID
                   WHERE SubID = 15
                   ORDER BY v.Name;", split = "\\n")[[1]]

sub(".*(FROM|JOIN) ([^ ]+).*", "\\2", lines[grep("(FROM|JOIN)", lines)]) # "Table.1" "Table.2" "Table.3"

分解:

# Use grep to find the indeces of any line containing 'FROM' or 'JOIN'
keywords_regex <- "(FROM|JOIN)"
line_indeces <- grep(keywords_regex, lines) # gives: 2 3 5
table_lines <- lines[line_indeces] # get just the lines that have table names

# Build regular expression to capture the next word after either keyword
table_name_regex <- paste0(".*", keywords_regex, " ([^ ]+).*")

# The "\\2" means to replace each match with the contents of the second capture 
# group, where a capture group is defined by parentheses in the regex
sub(table_name_regex, "\\2", table_lines)

【讨论】:

  • 我一直在尝试从以前的谷歌搜索中熟悉以这种方式使用 sub。您是否有任何有关以您的方式使用它的文档?我希望了解 Sub 函数内部发生了什么。感谢您的帮助,这非常有帮助
  • 当您说“以这种方式使用 sub”时,您的意思是正则表达式吗? (例如,他作为模式参数提供的看似神秘的“.*(FROM|JOIN) ([^ ]+).*”)。如果是这样,这个资源看起来不错:oreilly.com/ideas/an-introduction-to-regular-expressions
  • 我已经把我的答案分解了一点。我同意 HarlandMason 的观点,即您应该阅读受人尊敬的资料来了解正则表达式(这很复杂),但总体而言,sub 就像用第二个参数替换第一个参数匹配的内容一样简单。
  • 感谢您的帮助和解释!我会阅读您发送给我的资源,因为我需要更加熟悉它。
猜你喜欢
  • 2013-04-10
  • 1970-01-01
  • 2017-06-01
  • 2013-06-19
  • 2015-12-05
  • 2014-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多