输入一个字符串(例如“您叫什么名字?”)。输入中始终包含我要提取的问题。但是我要解决的问题是输入总是带有不需要的输入。
因此,输入可以是(但不限于)以下内容:
1- "eo000 ATATAT EG\n\nWhat is your name?\nkgda dasflkjasn"
2- "What is your\nlastname and email?\ndasf?lkjas"
3- "askjdmk.\nGiven your skills\nhow would you rate yourself?\nand your name? dasf?"
(请注意,在第三个输入处,问题以单词“ Given”开头,以“您自己?”结尾)
上面的输入示例是由pytesseract OCR库生成的,该库扫描图像并将其转换为文本
我只是想提取垃圾输入,并没有别的问题。
我尝试使用re库的find('?',1)函数来获取问题的最后一部分的索引(现在假设第一个问号始终是问题的结尾,而不是我输入的一部分)不想)。但是我不知道如何获得问题首字母的索引。我试图反向循环并在输入中得到第一个点\ n,但是问题并不总是在问题的第一个字母前有\ n。
def extractQuestion(input):
index_end_q = input.find('?', 1)
index_first_letter_of_q = 0 # TODO
question = '\n ' . join(input[index_first_letter_of_q :index_end_q ])
Run Code Online (Sandbox Code Playgroud)
小智 12
查找问题的第一个单词索引的一种方法是搜索具有实际含义的第一个单词(您对我认为的英语单词感兴趣)。一种方法是使用pyenchant:
#!/usr/bin/env python
import enchant
GLOSSARY = enchant.Dict("en_US")
def isWord(word):
return True if GLOSSARY.check(word) else False
sentences = [
"eo000 ATATAT EG\n\nWhat is your name?\nkgda dasflkjasn",
"What is your\nlastname and email?\ndasf?lkjas",
"\nGiven your skills\nhow would you rate yourself?\nand your name? dasf?"]
for sentence in sentences:
for i,w in enumerate(sentence.split()):
if isWord(w):
print('index: {} => {}'.format(i, w))
break
Run Code Online (Sandbox Code Playgroud)
上面的代码给出了以下结果:
index: 3 => What
index: 0 => What
index: 0 => Given
Run Code Online (Sandbox Code Playgroud)
你可以尝试一个正则表达式一样\b[A-Z][a-z][^?]+\?,意思是:
\b以大写字母开头,[A-Z]后接小写字母的单词开头[a-z],[^?]+,\?。这仍然可能会有一些误报或遗漏,例如,如果一个问题实际上以首字母缩写词开头,或者该问题的中间是否有名称,但是对于您来说,它的效果很好。
>>> tests = ["eo000 ATATAT EG\n\nWhat is your name?\nkgda dasflkjasn",
"What is your\nlastname and email?\ndasf?lkjas",
"\nGiven your skills\nhow would you rate yourself?\nand your name? dasf?"]
>>> import re
>>> p = r"\b[A-Z][a-z][^?]+\?"
>>> [re.search(p, t).group() for t in tests]
['What is your name?',
'What is your\nlastname and email?',
'Given your skills\nhow would you rate yourself?']
Run Code Online (Sandbox Code Playgroud)
如果那是一小段文字,则可以使用findall代替search:
>>> text = "\n".join(tests)
>>> re.findall(p, text)
['What is your name?',
'What is your\nlastname and email?',
'Given your skills\nhow would you rate yourself?']
Run Code Online (Sandbox Code Playgroud)
实际上,这对于名称中的问题似乎也相当有效:
>>> t = "asdGARBAGEasd\nHow did you like St. Petersburg? more stuff with ?"
>>> re.search(p, t).group()
'How did you like St. Petersburg?'
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
436 次 |
| 最近记录: |