假设我有一些字符串列表(在我的情况下是电影名称),现在我有一个新句子,其中包含字符串列表中的一个字符串。如何找到句子中的哪个字符串? 例如:
//we convert to a List[ProcessingFlow[_]] for simplicity
specs.map(toFlow).toList.foreach(broadcast ~> _ ~> merge)
对于上述情况,解决方案应该能够找到句子包含 green is gold 。 请建议可用的算法来解决此问题。 Python中的实现/库也可以工作。
句子可能包含很少不同的拼写。
字符串列表有10000-15000个字符串。
答案 0 :(得分:2)
它略微修改了在给定输入文本中查找单词集出现的标准问题。 Aho-Corasick算法可以有效地解决这个问题。您可以修改算法可用的源代码以满足您的需要 虽然子字符串函数可以帮助您作为其他人的回答,但它们可以处理小输入。对于较大的输入字符串,您需要一些线性时间算法。
答案 1 :(得分:1)
由于这里的大多数答案都集中在字符串搜索部分,我将考虑问题的另一个有趣部分,即拼写错误。
拼写错误案例在实际数据中非常有用且非常实用。
要处理它,您可以查看以下指标:
Levenshtein distance:它是一个字符串指标,用于衡量两个字符串之间的相似性。它基本上是最小的。单个字符编辑的数量(插入,删除,替换等),您可以将一个字符串转换为另一个字符串。
例如:
"green in gold", "grren in gold" : Distane = 1 // replace r by e
Python包:Levenstein Distance
Soundex :通常使用Soundex算法的某些变体来解决拼写问题。 Soundex是一种用于通过声音索引名称的语音算法,如英语中所述。目标是将同音异义词编码为相同的表示形式,以便尽管拼写上存在细微差别,但它们可以匹配。 (来源维基)
例如:Soundex(克林顿)= Soundex(Clenton)
Python库:Fuzzy
我希望它有所帮助。
答案 2 :(得分:0)
我不确定是否有更快的解决方案,但以下情况不应该太糟糕:
lower = sentence.lower()
for sub in list_of_string:
if sub.lower() in sentence:
print sub
我已经将句子和列表都转换为小写,因为您的示例表明您不关心案例。例如,这将允许“绿色”与“绿色”匹配。
答案 3 :(得分:0)
我会将您的list
转换为set
以提高效果。然后,你可以这样做:
list_of_strings = ['20th century women', 'green is gold ', 'fire at sea']
set_of_strings = set(s.strip().lower() for s in list_of_strings)
sentence = 'Official Trailer | Green is gold | Releasing Tomorrow'
parts = [i.strip() for i in sentence.split("|")]
for part in parts:
if part.lower() in set_of_strings:
print(part, "is a movie name")
答案 4 :(得分:0)
for s in list_of_strings:
if s in sentence:
print 'found it!'
您的示例句子在Green is gold
中有一个大写字母G,但字符串项目列表的小写字母g。
答案 5 :(得分:0)
此解决方案将处理所有大写字母,空格,标签案例:
for str in [str.lower().strip() for str in sentence.split(' | ')]:
if str in [str.lower().strip() for str in list_of_strings]:
print(str)
答案 6 :(得分:0)
尝试迭代字符串列表并查看其中一个字符串是否在句子中。如果是,则从列表中返回其索引。
for name in list_of_strings:
if name in sentence:
print list_of_strings.index(name)
请注意,您可能希望将所有字符串(在列表和句子中)分析为小写(使用.lower()
方法),因为两者之间的大小写可能不同。