R- 가장 긴 공통 서브 스트링
-
07-07-2019 - |
문제
누구나 해결하는 R 패키지를 알고 있습니까? 가장 긴 공통 서브 스트링 문제? 나는 벡터에서 작동 할 수있는 빨리 무언가를 찾고 있습니다.
해결책
Omegahat에서 "rlibstree"패키지를 확인하십시오. http://www.omegahat.org/rlibstree/.
이것은 사용합니다 http://www.icir.org/christian/libstree/.
다른 팁
당신은 LCS
기능 qualV
패키지. 그것은 c- 이식되어 있으므로 상당히 효율적입니다.
여기서 문제는 가장 긴 공통 서브 스트링 문제에 대한 솔루션의 의도 된 적용에 대해 완전히 명확하지 않습니다. 내가 만나는 일반적인 응용 프로그램은 다른 데이터 세트의 이름간에 일치합니다. 그만큼 stringdist
패키지에는 유용한 기능이 있습니다 amatch()
이 작업에 적합하다고 생각합니다.
간단히, amatch()
입력 2 개의 벡터로 취할 것입니다. 첫 번째는 x
당신이 일치하는 일치를 찾고자하는 문자열의 벡터 (이것은 또한 단일 문자열 일 수 있음), 두 번째는 다음과 같습니다. table
, 이것은 당신이 비교하고 가장 긴 공통 서브 스트링과 일치하는 문자열의 벡터입니다. amatch()
그런 다음 길이와 같은 벡터를 반환합니다. x
-이 결과의 각 요소는 인덱스가됩니다. table
여기에는 최고의 경기가 포함되어 있습니다.
세부: amatch()
a method
당신이 지정하는 인수 lcs
가장 긴 공통 서브 스트링과 일치하는 경우. 다른 문자열 일치 기술 (예 : Levenshtein 거리)에 대한 다른 많은 옵션이 있습니다. 필수도 있습니다 maxDist
논쟁. 모든 문자열이 있다면 table
주어진 문자열에서 "거리"가 더 큽니다. x
, 그 다음에 amatch()
돌아올 것입니다 NA
출력의 그 요소에 대해. "거리"는 선택한 문자열 일치 알고리즘에 따라 다르게 정의됩니다. LCS의 경우, (다소)는 몇 개의 다른 (비 일치) 문자가 있는지를 의미합니다. 자세한 내용은 문서를 참조하십시오.
병렬화: 또 다른 멋진 기능 amatch()
그것이 당신을 위해 작동을 자동으로 병렬화하여 사용할 시스템 리소스에 대해 합리적인 추측을 할 것입니다. 이것에 대한 더 많은 제어를 원한다면 nthread
논쟁.
예제 응용 프로그램:
library(stringdist)
Names1 = c(
"SILVER EAGLE REFINING, INC. (SW)",
"ANTELOPE REFINING",
"ANTELOPE REFINING (DOUGLAS FACILITY)"
)
Names2 = c(
"Mobile Concrete, Inc.",
"Antelope Refining, LLC. ",
"Silver Eagle Refining Inc."
)
Match_Idx = amatch(tolower(Names1), tolower(Names2), method = 'lcs', maxDist = Inf)
Match_Idx
# [1] 3 2 2
Matches = data.frame(Names1, Names2[Match_Idx])
Matches
# Names1 Names2.Match_Idx.
# 1 silver eagle refining, inc. (sw) silver eagle refining inc.
# 2 antelope refining antelope refining, llc.
# 3 antelope refining (douglas facility) antelope refining, llc.
### Compare Matches:
Matches$Distance = stringdist(Matches$Names1, Matches$Match, method = 'lcs')
또한 기능과는 달리 LCS
~에서 qualV
, 이것은 일치를 형성하기 위해 중간 문자를 무시하는 "후속 시퀀스"일치를 고려하지 않습니다 (논의 된대로 여기). 예를 들어, 이것을 참조하십시오.
Names1 = c(
"hello"
)
Names2 = c(
"hel123l5678o",
"hell"
)
Match_Idx = amatch(tolower(Names1), tolower(Names2), method = 'lcs', maxDist = Inf)
Matches = data.frame(Names1, Match = Names2[Match_Idx])
Matches
# 1 hello hell
나는 R를 모르지만, 나는 빠르고 너무 많은 공간을 소비하지 않는 Hirschberg의 알고리즘을 구현하는 데 사용했습니다.
내가 기억하는 것처럼 그것은 단지 재귀 적으로 짧은 기능이라고 불리는 2 ~ 3 개뿐입니다.
다음은 링크입니다.http://wordaligned.org/articles/longest-common-subsequence
따라서 R에서 구현하는 것을 망설이지 마십시오. 매우 흥미로운 알고리즘이기 때문에 노력할 가치가 있습니다.