0

我需要在许多句子中找到一个单词的第一个字符。所有的句子都有某种形式的“猜想”一词,即猜想、猜想等。但是我不能像这样在“查找”中使用通配符

firstSpace = mySentence.find('conjecture'*,0)

句子看起来像:

'There is considerable conjecture and debate as to how...'
'He conjectured that the interface was...'

有什么想法我该怎么做?谢谢!

4

3 回答 3

4

您可以先尝试删除特殊字符:

x = '“ There is considerable conjecture and debate as to how...

newx = ''.join(e for e in x.lower() if e.isalnum())

print newx

>>> 'thereisconsiderableconjectureanddebateastohow'

然后使用find来定位您的单词。

祝你好运!

编辑:

如果要查找指定单词之前的单词,可以拆分句子。这是一段可能有帮助的代码:

paragraph = 'The quick brown fox jumps over the lazy dog. I have two big dogs. Furry Dogs are the best. $%^Dogs love me.'
paragraph = ''.join(e for e in paragraph.lower() if e.isalnum() or e.isspace() or e=='.')
sentence_list = paragraph.split('.')
prev_word_list = []
for sentence in sentence_list:
    word_list = sentence.split()
    prev_word = ''
    for i,word in enumerate(word_list):
        if i == 0:
            pass
        else:
            if 'dog' in word.lower():
                prev_word = word_list[i-1]
                prev_word_list.append(prev_word)

这给出了:

>>> print prev_word_list
>>> ['lazy', 'big', 'furry']
于 2012-12-07T07:28:19.790 回答
2

所有句子都有某种形式的“猜想”一词,即猜想、猜想等。

word in string其他答案中显示的方法通常会失败,例如,他们不会community在包含其中的句子中找到单词communities

在这种情况下,您可能需要一个词干算法,例如nltk.stempackage提供的:

from nltk.stem.snowball import EnglishStemmer
from nltk import word_tokenize

stemmer = EnglishStemmer()
stem_word = stemmer.stem

stem = stem_word(u"conjecture")
sentence = u'He conjectured that the interface was...'
words = word_tokenize(sentence)
found_words = [(i, w) for i, w in enumerate(words) if stem_word(w) == stem]
# -> [(1, u'conjectured')]

nltk中还有其他 stem 和tokenize 方法,您可以根据您的确切需要使用它们。

但是有些词以讨厌的字符开头:“或类似..我怎样才能摆脱它们?

“讨厌的字符”是错误地将utf-8字节序列视为的结果cp1252

>>> utf8bytes = u"microsoft smart quote (\u201c)".encode('utf-8')
>>> print utf8bytes.decode('cp1252')
microsoft smart quote (“)
>>> print utf8bytes.decode('utf-8')
microsoft smart quote (“)

您不应该盲目删除乱码文本,而是修复字符编码。

为什么#AskObama 推文在屏幕上出现乱码:了解您的 UTF-8、Unicode、ASCII 和 ANSI 解码总统先生在电视上展示了一个关于此问题的公开示例。

要理解阅读每个软件开发人员绝对、肯定必须了解 Unicode 和字符集的绝对最低要求(没有借口!)

于 2012-12-07T10:32:31.163 回答
1

忘记实际上在后台完成的隐式工作,这至少会实现您要求的任务(希望如此)。

unicodedata.normalize('NFKD', mySentence).encode('ascii', 'ignore').lower().find("conjecture")

好吧,老实说,我希望正则表达式可以为您设置线性搜索,但是 unicode 值通常会分成两个“字符”。

相反,这是一个至少可以完成工作的 hack:

newSentence = ""
for i in range(0, len(mySentence)):
   if ord(mySentence[i]) > 128:
         newSentence += '_'
   else:
         newSentence += mySentence[i]

newSentence.encode("UTF-8").lower().find("conjecture")

如果您想忘记那些讨厌的编码字符:

mySentence.decode("ascii", "ignore").encode("UTF-8").lower().find("conjecture")



Sample input: >>> newStr = "“32f fWF  3(*&(%FJ   conJectuRe€@!O".decode("ascii", "ignore").encode("UTF-8").lower()
              >>> print newStr
              >>> print newStr.find("conjecture")

Output:       '32f fwf  3(*&(%fj   conjecture@!o'
              20
于 2012-12-07T06:47:36.110 回答