知道如何使用 VBA(excel)识别和提取名词和修饰符
示例:
球阀2in用于带垫圈的绿色泵
应该是: 球阀
任何帮助将不胜感激
答案 0 :(得分:1)
根据您期望的句子类型,有一些不同的方法。在您的示例中,您要提取的两个单词位于句子的开头,并以空格分隔。如果您希望始终如此,那么您可以使用简单的
Function getNoun(ByVal sentence As String)
getNoun = ""
pos1 = InStr(1, sentence, " ") 'find the first whitespace
If pos1 <= 0 Then
getNoun = sentence 'if no whitespace, then assume there is only the noun
Exit Function
End If
pos2 = InStr(pos1 + 1, sentence, " ") 'find the second whitespace
If pos2 <= 0 Then
getNoun = sentence 'if no second whitespace, then assume there is only the noun and qualifier
Exit Function
End If
getNoun = Left(sentence, pos2 - 1) 'if there are two or more spaces, get all chars before the second one
End Function
立即测试窗口:
? getNoun("ball valve 2in for green pump with gasket")
ball valve
? getNoun("ball valve")
ball valve
? getNoun("ball")
ball
如果您的场景更复杂,并且您需要使用特定标准来确定哪些单词是所需的名词和限定符,您可能会找到用于Regex COM类的内容(例如,请参阅this topic)。
编辑:根据评论,我理解职位是可变的,并且可以使用MS Word同义词作为参考。如果代码将在Microsoft Word中运行,则以下函数将告诉您单词是否为名词:
Function is_noun(ByVal wrd As String)
Dim s As Object, l As Variant
is_noun = False
Set s = SynonymInfo(wrd)
Let l = s.PartOfSpeechList
If s.MeaningCount <> 0 Then
For i = LBound(l) To UBound(l)
If l(i) = wdNoun Then
is_noun = True
End If
Next
End If
End Function
如果您没有在MS Word上运行(您的标签建议使用MS Excel)但在目标系统中安装了MS Word,那么您可以调整上述代码以使用MS Word COM自动化对象。
然后你可以从一个句子中提取第一个名词和下一个词 - 如果有的话 - 用这样的东西
Function getNoun(ByVal sentence As String)
getNoun = ""
Dim wrds() As String
wrds = Split(sentence)
For i = LBound(wrds) To UBound(wrds)
If is_noun(wrds(i)) Then
getNoun = wrds(i)
If i < UBound(wrds) Then
getNoun = getNoun & " " & wrds(i + 1)
End If
Exit Function
End If
Next
End Function
但请注意,如果您的句子包含,例如,根据上下文可能是动词或名词的单词,那么您可能会盲目地信任MS Word的单词数据库。此外,上面的示例将使用您的MS Word设置的默认语言(可以使用另一个 - 如果已安装 - 通过在SynonymInfo
中包含语言参数)