문제

누구나 해결하는 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에서 구현하는 것을 망설이지 마십시오. 매우 흥미로운 알고리즘이기 때문에 노력할 가치가 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top