文字识别

时间:2016-10-11 19:11:42

标签: python algorithm text

假设我有一些字符串列表(在我的情况下是电影名称),现在我有一个新句子,其中包含字符串列表中的一个字符串。如何找到句子中的哪个字符串? 例如:

//we convert to a List[ProcessingFlow[_]] for simplicity
specs.map(toFlow).toList.foreach(broadcast ~> _ ~> merge)

对于上述情况,解决方案应该能够找到句子包含 green is gold 。 请建议可用的算法来解决此问题。 Python中的实现/库也可以工作。

  

句子可能包含很少不同的拼写。

字符串列表有10000-15000个字符串。

7 个答案:

答案 0 :(得分:2)

它略微修改了在给定输入文本中查找单词集出现的标准问题。 Aho-Corasick算法可以有效地解决这个问题。您可以修改算法可用的源代码以满足您的需要 虽然子字符串函数可以帮助您作为其他人的回答,但它们可以处理小输入。对于较大的输入字符串,您需要一些线性时间算法。

答案 1 :(得分:1)

由于这里的大多数答案都集中在字符串搜索部分,我将考虑问题的另一个有趣部分,即拼写错误。

拼写错误案例在实际数据中非常有用且非常实用。

要处理它,您可以查看以下指标:

  1. Levenshtein distance:它是一个字符串指标,用于衡量两个字符串之间的相似性。它基本上是最小的。单个字符编辑的数量(插入,删除,替换等),您可以将一个字符串转换为另一个字符串。

    例如:

    "green in gold", "grren in gold" : Distane = 1 // replace r by e

    Python包:Levenstein Distance

  2. Soundex :通常使用Soundex算法的某些变体来解决拼写问题。 Soundex是一种用于通过声音索引名称的语音算法,如英语中所述。目标是将同音异义词编码为相同的表示形式,以便尽管拼写上存在细微差别,但它们可以匹配。 (来源维基)

    例如:Soundex(克林顿)= Soundex(Clenton)

    Python库:Fuzzy

  3. 我希望它有所帮助。

答案 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()方法),因为两者之间的大小写可能不同。